mirror of
https://github.com/schrodinger/pymol-open-source.git
synced 2026-06-05 20:14:24 +08:00
173 lines
6.7 KiB
Python
173 lines
6.7 KiB
Python
|
|
'''
|
|
Testing properties for simple getting/setting and loading from sdf and mae files
|
|
'''
|
|
|
|
import unittest
|
|
from pymol import cmd, testing
|
|
|
|
@testing.requires('properties')
|
|
class TestProperties(testing.PyMOLTestCase):
|
|
|
|
# test loading MAE files with no properties (default)
|
|
def testMAEloadNoProperties(self):
|
|
cmd.load(self.datafile('1d_smiles.mae'), '1d_smiles')
|
|
objs = cmd.get_object_list()
|
|
for obj in objs:
|
|
props = cmd.get_property('', obj)
|
|
self.assertIsNone(props)
|
|
|
|
# test loading MAE files with all properties
|
|
def testMAEloadAllProperties(self):
|
|
cmd.load(self.datafile('1d_smiles.mae'), '1d_smiles', object_props='*')
|
|
objs = cmd.get_object_list()
|
|
for obj in objs:
|
|
props = cmd.get_property_list(obj)
|
|
self.assertIsNotNone(props)
|
|
|
|
# test loading MAE files with some properties listed
|
|
def testMAEloadSomeProperties(self):
|
|
props = ['s_knime_origin_file_name', 's_knime_origin_hostname']
|
|
cmd.load(self.datafile('1d_smiles.mae'), '1d_smiles', object_props=' '.join(props))
|
|
objs = cmd.get_object_list()
|
|
for obj in objs:
|
|
allprops = cmd.get_property_list(obj)
|
|
self.assertEqual(len(props), len(allprops))
|
|
|
|
# test loading MAE files with some properties listed that do not exist
|
|
def testMAEloadSomePropertiesDontExist(self):
|
|
props = ['s_knime_origin_file_name', 's_knime_origin_hostname', 'dontexist']
|
|
cmd.load(self.datafile('1d_smiles.mae'), '1d_smiles', object_props=' '.join(props))
|
|
objs = cmd.get_object_list()
|
|
for obj in objs:
|
|
allprops = cmd.get_property_list(obj)
|
|
self.assertIsNotNone(allprops)
|
|
|
|
# test loading MAE files with no properties listed
|
|
def testMAEloadSomePropertiesEmptyList(self):
|
|
props = []
|
|
cmd.load(self.datafile('1d_smiles.mae'), '1d_smiles', object_props=' '.join(props))
|
|
objs = cmd.get_object_list()
|
|
for obj in objs:
|
|
allprops = cmd.get_property_list(obj)
|
|
self.assertIsNone(allprops)
|
|
|
|
def testMAEsaveLoadSessions(self):
|
|
cmd.load(self.datafile('1d_smiles.mae'), '1d_smiles', object_props='*')
|
|
allpropdata = {}
|
|
objs = cmd.get_object_list()
|
|
for obj in objs:
|
|
props = cmd.get_property_list(obj)
|
|
allpropdata[obj] = {}
|
|
for prop in props:
|
|
allpropdata[obj][prop] = cmd.get_property(prop, obj)
|
|
with testing.mktemp('.pse') as psefilename:
|
|
cmd.save(psefilename)
|
|
cmd.load(psefilename)
|
|
# this is to fail the test on purpose
|
|
# cmd.set_property('i_m_ct_format', 3, '1d_smiles.mol_13')
|
|
objs = cmd.get_object_list()
|
|
for obj in objs:
|
|
props = cmd.get_property_list(obj)
|
|
# test to make sure there are no extra properties or not enough properties
|
|
self.assertEqual(set(props), set(allpropdata[obj].keys()))
|
|
# test to make sure all property values are the same
|
|
for prop in props:
|
|
try:
|
|
self.assertTrue(allpropdata[obj][prop] == cmd.get_property(prop, obj))
|
|
except:
|
|
self.fail('properties are not the same: obj=%s prop=%s' % (obj, prop))
|
|
|
|
def testMAEchempy(self):
|
|
cmd.load(self.datafile('1d_smiles.mae'), '1d_smiles', object_props='*')
|
|
objs = cmd.get_object_list()
|
|
for obj in objs:
|
|
model = cmd.get_model(obj)
|
|
prop_list= cmd.get_property_list(obj)
|
|
mol_prop_list = [x[0] for x in model.molecule_properties]
|
|
self.assertEqual(set(prop_list), set(mol_prop_list))
|
|
|
|
def testSimple(self):
|
|
cmd.fab('A', 'm1')
|
|
cmd.fab('A', 'm2')
|
|
v1 = 'foo'
|
|
v2 = 'bar'
|
|
v3 = 'com'
|
|
|
|
# single state
|
|
cmd.set_property('filename', v1, 'm1')
|
|
self.assertTrue('foo' == v1)
|
|
self.assertTrue(cmd.get_property('filename', 'm1') == v1)
|
|
self.assertTrue(cmd.get_property('filename', 'm2') == None)
|
|
|
|
# multiple objects
|
|
cmd.set_property('filename', v1)
|
|
self.assertTrue(cmd.get_property('filename', 'm2') == v1)
|
|
|
|
# two states
|
|
cmd.create('m1', 'm1', 1, 2)
|
|
self.assertTrue(cmd.count_states() == 2)
|
|
|
|
# set for all states
|
|
cmd.set_property('filename', v1, 'm1')
|
|
self.assertTrue(cmd.get_property('filename', 'm1', 2) == v1)
|
|
|
|
# set for particular state
|
|
cmd.set_property('filename', v2, 'm1', 2)
|
|
self.assertTrue(cmd.get_property('filename', 'm1', 1) == v1)
|
|
self.assertTrue(cmd.get_property('filename', 'm1', 2) == v2)
|
|
|
|
# set for current state
|
|
cmd.frame(2)
|
|
cmd.set_property('filename', v3, 'm1', -1)
|
|
self.assertTrue(cmd.get_property('filename', 'm1', 1) == v1)
|
|
self.assertTrue(cmd.get_property('filename', 'm1', 2) == v3)
|
|
|
|
def testSDF(self):
|
|
# get molecule with SDF annotations
|
|
cid = 6830
|
|
|
|
cmd.set('load_object_props_default', '')
|
|
cmd.load('CID_%d.sdf' % cid, 'm1')
|
|
self.assertEqual(None, cmd.get_property('PUBCHEM_COMPOUND_CID', 'm1'),
|
|
'property loaded, but should not')
|
|
cmd.delete('*')
|
|
|
|
cmd.load('CID_%d.sdf' % cid, 'm1', object_props='*')
|
|
self.assertEqual(cid, cmd.get_property('PUBCHEM_COMPOUND_CID', 'm1'))
|
|
|
|
v_pc = cmd.get_property('PUBCHEM_MMFF94_PARTIAL_CHARGES', 'm1')
|
|
lines = v_pc.rstrip().splitlines()
|
|
n_pc = int(lines[0])
|
|
self.assertEqual(n_pc, len(lines) - 1)
|
|
|
|
# test loading selective properties
|
|
cmd.set('load_object_props_default', "PUBCHEM_COMPOUND_CID PUBCHEM_CONFORMER_RMSD PUBCHEM_CONFORMER_DIVERSEORDER")
|
|
cmd.load('CID_%d.sdf' % cid, 'm2')
|
|
self.assertEqual(cid, cmd.get_property('PUBCHEM_COMPOUND_CID', 'm2'))
|
|
self.assertEqual(None, cmd.get_property('PUBCHEM_EFFECTIVE_ROTOR_COUNT', 'm2'))
|
|
|
|
@testing.requires_version('2.5')
|
|
def testRemoveAtoms(self):
|
|
# Removing atoms must not remove object properties PYMOL-3583
|
|
cmd.fragment("ala")
|
|
cmd.set_property("foo", 123, "ala")
|
|
self.assertEqual(cmd.get_property("foo", "ala"), 123)
|
|
cmd.remove("hydro")
|
|
self.assertEqual(cmd.get_property("foo", "ala"), 123)
|
|
|
|
def testRemoveAtomsPreserveAtomProperties(self):
|
|
# Removing atoms must preserve atom properties
|
|
cmd.fab("ACD")
|
|
cmd.alter("all", "p.foo = ID = index")
|
|
# force new sorting
|
|
cmd.alter("resi 2", "resv=4")
|
|
cmd.sort()
|
|
# remove some atoms
|
|
cmd.remove("elem C")
|
|
checklist = []
|
|
cmd.iterate("all", "checklist.append((p.foo == ID))", space=locals())
|
|
self.assertTrue(all(checklist))
|
|
|
|
# vi:nowrap
|