Skip to content
Snippets Groups Projects
Commit d2b73c71 authored by Gerardo Tauriello's avatar Gerardo Tauriello
Browse files

SCHWED-2043: detailled tests for QSscoreEntity

parent b388533b
No related branches found
No related tags found
No related merge requests found
import unittest, os import unittest, os
import ost
from ost import io from ost import io
from ost.mol.alg.qsscoring import * from ost.mol.alg.qsscoring import *
...@@ -10,13 +11,115 @@ def _LoadFile(file_name): ...@@ -10,13 +11,115 @@ def _LoadFile(file_name):
class TestQSscore(unittest.TestCase): class TestQSscore(unittest.TestCase):
# TESTS base
def test_QSscoreEntity(self):
# use smallest test structure...
ent = _LoadFile('3ia3.1.pdb')
ent.SetName("my_ent")
# create clean one
qs_ent = QSscoreEntity(ent)
self.assertTrue(qs_ent.is_valid)
# check naming
qs_ent.SetName("my_qs_ent")
self.assertEqual(qs_ent.original_name, "my_ent")
self.assertEqual(qs_ent.GetName(), "my_qs_ent")
# check cleanup
self.assertEqual(sorted(ch.name for ch in qs_ent.ent.chains), ['A', 'B'])
self.assertEqual(qs_ent.removed_chains, ['_'])
self.assertFalse(qs_ent.calpha_only)
# check CA entity
ca_ent = qs_ent.ca_entity
self.assertEqual(sorted(ch.name for ch in ca_ent.chains), ['A', 'B'])
self.assertEqual(ca_ent.residue_count, ca_ent.atom_count)
self.assertEqual(ca_ent.Select('aname=CA').atom_count, ca_ent.atom_count)
self.assertEqual(sorted(qs_ent.ca_chains.keys()), ['A', 'B'])
for ch in ca_ent.chains:
self.assertEqual(''.join([r.one_letter_code for r in ch.residues]),
str(qs_ent.ca_chains[ch.name]))
# check chem groups
self.assertEqual(sorted(qs_ent.chem_groups), [['A'], ['B']])
# check contacts
self.assertEqual(len(qs_ent.contacts['A']['B']), 45)
self.assertAlmostEqual(qs_ent.contacts['A']['B'][23][127], 10.069, 2)
self.assertEqual(len(qs_ent.contacts_ca['A']['B']), 42)
self.assertAlmostEqual(qs_ent.contacts_ca['A']['B'][23][127], 10.471, 2)
# check contact filtering
old_contacts = qs_ent.contacts.copy()
old_contacts_ca = qs_ent.contacts_ca.copy()
qs_ent.contacts = old_contacts
self.assertEqual(qs_ent.contacts, old_contacts)
qs_ent.contacts_ca = old_contacts_ca
self.assertEqual(qs_ent.contacts_ca, old_contacts_ca)
dummy_contacts = {'A': {'B': {1: {2: 3.0, 4: 5.0}},
'C': {10: {20: 30.0, 40: 50.0}}},
'B': {'C': {100: {200: 300.0, 400: 500.0}}}}
qs_ent.contacts = dummy_contacts
self.assertEqual(qs_ent.contacts, {'A': {'B': {1: {2: 3.0, 4: 5.0}}}})
self.assertEqual(qs_ent.contacts_ca, old_contacts_ca)
qs_ent.contacts = old_contacts
qs_ent.contacts_ca = dummy_contacts
self.assertEqual(qs_ent.contacts, old_contacts)
self.assertEqual(qs_ent.contacts_ca, {'A': {'B': {1: {2: 3.0, 4: 5.0}}}})
# check chain removal for non-amino acid chains
ent_extra = ent.Copy()
edi = ent_extra.EditXCS()
# classic ligand chain
ch = edi.InsertChain('C')
for _ in range(30):
r = edi.AppendResidue(ch, 'HOH')
edi.InsertAtom(r, 'O', ost.geom.Vec3())
# DNA chain
ch = edi.InsertChain('D')
for _ in range(30):
r = edi.AppendResidue(ch, 'A')
edi.InsertAtom(r, 'P', ost.geom.Vec3())
edi.UpdateICS()
# ensure both removed
qs_ent_test = QSscoreEntity(ent_extra)
self.assertEqual(sorted(qs_ent_test.removed_chains), ['C', 'D', '_'])
# invalid structures: monomers (or less) before or after cleaning
ost.PushVerbosityLevel(-1)
# empty view
ent_empty = ent.CreateEmptyView()
qs_ent_invalid = QSscoreEntity(ent_empty)
self.assertFalse(qs_ent_invalid.is_valid)
# monomer
ent_mono = ent.Select('cname=A')
qs_ent_invalid = QSscoreEntity(ent_mono)
self.assertFalse(qs_ent_invalid.is_valid)
# short chain removed
ent_short = ent.Select('cname=A or rnum<20')
qs_ent_invalid = QSscoreEntity(ent_short)
self.assertFalse(qs_ent_invalid.is_valid)
self.assertEqual(sorted(qs_ent_invalid.removed_chains), ['B', '_'])
# non-AA chain removal
ent_non_AA = ent_extra.Select('cname=A,C,D')
qs_ent_invalid = QSscoreEntity(ent_non_AA)
self.assertFalse(qs_ent_invalid.is_valid)
self.assertEqual(sorted(qs_ent_invalid.removed_chains), ['C', 'D'])
ost.PopVerbosityLevel()
# exception when scoring with invalid QSscoreEntity
with self.assertRaises(QSscoreError):
qs_scorer_tst = QSscorer(qs_ent_invalid, qs_ent)
qs_scorer_tst.global_score
with self.assertRaises(QSscoreError):
qs_scorer_tst = QSscorer(qs_ent, qs_ent_invalid)
qs_scorer_tst.global_score
# TESTS HETERO
def test_HeteroCase1(self): def test_HeteroCase1(self):
# additional chains # additional chains
ent_1 = _LoadFile('4ux8.1.pdb') # A2 B2 C2, symmetry: C2 ent_1 = _LoadFile('4ux8.1.pdb') # A2 B2 C2, symmetry: C2
ent_2 = _LoadFile('3fub.2.pdb') # A2 B2 , symmetry: C2 ent_2 = _LoadFile('3fub.2.pdb') # A2 B2 , symmetry: C2
qs_scorer = QSscorer(ent_1, ent_2) qs_scorer = QSscorer(ent_1, ent_2)
# check properties # check properties
self.assertEqual(qs_scorer.calpha_only, False) self.assertFalse(qs_scorer.calpha_only)
# check mappings # check mappings
self.assertEqual(qs_scorer.chem_mapping, self.assertEqual(qs_scorer.chem_mapping,
{('D', 'F'): ('B', 'D'), ('C', 'E'): ('A', 'C')}) {('D', 'F'): ('B', 'D'), ('C', 'E'): ('A', 'C')})
...@@ -36,7 +139,7 @@ class TestQSscore(unittest.TestCase): ...@@ -36,7 +139,7 @@ class TestQSscore(unittest.TestCase):
ent_2 = _LoadFile('3fub.au.pdb') ent_2 = _LoadFile('3fub.au.pdb')
qs_scorer = QSscorer(ent_1, ent_2) qs_scorer = QSscorer(ent_1, ent_2)
# check properties # check properties
self.assertEqual(qs_scorer.calpha_only, False) self.assertFalse(qs_scorer.calpha_only)
# check mappings # check mappings
self.assertEqual(qs_scorer.chem_mapping, self.assertEqual(qs_scorer.chem_mapping,
{('C', 'E'): ('A', 'C'), ('D', 'F'): ('D', 'B')}) {('C', 'E'): ('A', 'C'), ('D', 'F'): ('D', 'B')})
...@@ -81,11 +184,17 @@ class TestQSscore(unittest.TestCase): ...@@ -81,11 +184,17 @@ class TestQSscore(unittest.TestCase):
qs_scorer = QSscorer(ent_1, ent_2) qs_scorer = QSscorer(ent_1, ent_2)
self.assertAlmostEqual(qs_scorer.global_score, 0.980, 2) self.assertAlmostEqual(qs_scorer.global_score, 0.980, 2)
self.assertAlmostEqual(qs_scorer.best_score, 0.980, 2) self.assertAlmostEqual(qs_scorer.best_score, 0.980, 2)
# check properties
self.assertFalse(qs_scorer.calpha_only)
# check mappings
self.assertEqual(qs_scorer.chem_mapping, {('A',): ('B',), ('B',): ('A',)})
self.assertEqual(qs_scorer.chain_mapping, {'A': 'B', 'B': 'A'})
# check if CA-only scoring is close to this # check if CA-only scoring is close to this
ent_2_ca = ent_2.Select('aname=CA') ent_2_ca = ent_2.Select('aname=CA')
# use QSscoreEntity to go faster # use QSscoreEntity to go faster
qs_scorer_ca = QSscorer(qs_scorer.qs_ent_1, ent_2_ca) qs_scorer_ca = QSscorer(qs_scorer.qs_ent_1, ent_2_ca)
self.assertTrue(qs_scorer_ca.calpha_only)
self.assertAlmostEqual(qs_scorer_ca.global_score, qs_scorer.global_score, 2) self.assertAlmostEqual(qs_scorer_ca.global_score, qs_scorer.global_score, 2)
self.assertAlmostEqual(qs_scorer_ca.best_score, qs_scorer.best_score, 2) self.assertAlmostEqual(qs_scorer_ca.best_score, qs_scorer.best_score, 2)
# throw exception for messed up chains without CA atoms # throw exception for messed up chains without CA atoms
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment