File: testFeatures.py

package info (click to toggle)
rdkit 201809.1%2Bdfsg-6
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 123,688 kB
  • sloc: cpp: 230,509; python: 70,501; java: 6,329; ansic: 5,427; sql: 1,899; yacc: 1,739; lex: 1,243; makefile: 445; xml: 229; fortran: 183; sh: 123; cs: 93
file content (118 lines) | stat: -rw-r--r-- 4,279 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# $Id$
#
# Copyright (C) 2006-2008 Greg Landrum
#
#  @@ All Rights Reserved @@
#
from __future__ import print_function
import os, sys
import io
import unittest
from rdkit.six.moves import cPickle
from rdkit import RDConfig
from rdkit import Chem
from rdkit.Chem import ChemicalFeatures
from rdkit.Geometry import rdGeometry as geom


def feq(v1, v2, tol2=1e-4):
  return abs(v1 - v2) <= tol2


def lstFeq(l1, l2, tol=1.e-4):
  if (len(l1) != len(l2)):
    return 0
  for i in range(len(l1)):
    if not feq(l1[i], l2[i], tol):
      return 0
  return 1


def ptFeq(pt1, pt2, tol=0.0001):
  dist = pt1.Distance(pt2)
  return feq(dist, 0.0, tol)


class TestCase(unittest.TestCase):

  def setUp(self):
    pass

  def testBasic(self):
    ffeat = ChemicalFeatures.FreeChemicalFeature()
    ffeat.SetId(123)
    pos = ffeat.GetId()
    self.assertTrue(pos == 123)
    ffeat.SetFamily("HBondDonor")
    self.assertTrue(ffeat.GetFamily() == "HBondDonor")
    ffeat.SetPos(geom.Point3D(1.0, 2.0, 3.0))
    pos = ffeat.GetPos()
    self.assertTrue(ptFeq(pos, geom.Point3D(1.0, 2.0, 3.0)))
    ffeat.SetType("HBondDonor1")
    self.assertTrue(ffeat.GetType() == "HBondDonor1")

    ffeat = ChemicalFeatures.FreeChemicalFeature("HBondDonor", "HBondDonor1", geom.Point3D(1.0, 2.0,
                                                                                           3.0))
    self.assertTrue(ffeat.GetId() == -1)
    self.assertTrue(ffeat.GetFamily() == "HBondDonor")
    self.assertTrue(ffeat.GetType() == "HBondDonor1")

    ffeat = ChemicalFeatures.FreeChemicalFeature("HBondDonor", "HBondDonor1",
                                                 geom.Point3D(1.0, 2.0, 3.0), id=123)
    self.assertTrue(ffeat.GetId() == 123)
    self.assertTrue(ffeat.GetFamily() == "HBondDonor")
    self.assertTrue(ffeat.GetType() == "HBondDonor1")

    pos = ffeat.GetPos()
    self.assertTrue(ptFeq(pos, geom.Point3D(1.0, 2.0, 3.0)))

    ffeat = ChemicalFeatures.FreeChemicalFeature(id=123, type="HBondDonor1", family="HBondDonor",
                                                 loc=geom.Point3D(1.0, 2.0, 3.0))
    self.assertTrue(ffeat.GetId() == 123)
    self.assertTrue(ffeat.GetFamily() == "HBondDonor")
    self.assertTrue(ffeat.GetType() == "HBondDonor1")
    pos = ffeat.GetPos()
    self.assertTrue(ptFeq(pos, geom.Point3D(1.0, 2.0, 3.0)))

  def testPickle(self):
    ffeat = ChemicalFeatures.FreeChemicalFeature("HBondDonor", "HBondDonor1",
                                                 geom.Point3D(1.0, 2.0, 3.0), 123)
    pkl = cPickle.dumps(ffeat)
    ffeat2 = cPickle.loads(pkl, encoding='bytes')
    self.assertTrue(ffeat2.GetId() == ffeat.GetId())
    self.assertTrue(ffeat2.GetFamily() == ffeat.GetFamily())
    self.assertTrue(ffeat2.GetType() == ffeat.GetType())
    self.assertTrue(ptFeq(ffeat2.GetPos(), ffeat.GetPos()))

    # Check that the old pickled versions have not been broken
    inTF = open(
      os.path.join(RDConfig.RDBaseDir, 'Code/ChemicalFeatures/Wrap/testData/feat.pkl'), 'r')
    buf = inTF.read().replace('\r\n', '\n').encode('utf-8')
    inTF.close()
    inF = io.BytesIO(buf)
    ffeat2 = cPickle.load(inF, encoding='bytes')
    # this version (1.0) does not have an id in the byte stream
    self.assertTrue(ffeat2.GetFamily() == ffeat.GetFamily())
    self.assertTrue(ffeat2.GetType() == ffeat.GetType())
    self.assertTrue(ptFeq(ffeat2.GetPos(), ffeat.GetPos()))

    # Test the new version also has the id and works as expected

    # uncomment the following to generate (overrwrite) new version of pickled
    # data file
    #cPickle.dump(ffeat,file(os.path.join(RDConfig.RDBaseDir, 'Code/ChemicalFeatures/Wrap/testData/featv2.pkl'),'wb+'))
    inTF = open(
      os.path.join(RDConfig.RDBaseDir, 'Code/ChemicalFeatures/Wrap/testData/featv2.pkl'), 'r')
    buf = inTF.read().replace('\r\n', '\n').encode('utf-8')
    inTF.close()
    inF = io.BytesIO(buf)
    ffeat2 = cPickle.load(inF, encoding='bytes')
    self.assertTrue(ffeat2.GetId() == ffeat.GetId())
    self.assertTrue(ffeat2.GetFamily() == ffeat.GetFamily())
    self.assertTrue(ffeat2.GetType() == ffeat.GetType())
    self.assertTrue(ptFeq(ffeat2.GetPos(), ffeat.GetPos()))


if __name__ == '__main__':
  print("Testing ChemicalFeatures Wrapper code:")
  unittest.main()