1
2
3
4
5
6
7 from rdkit import Geometry
8 import numpy
9 from rdkit import Chem
10 from rdkit.Chem import ChemicalFeatures
11 from rdkit.RDLogger import logger
12 logger = logger()
13
15 - def __init__(self, feats,initMats=True):
16 self._initializeFeats(feats)
17 nf = len(feats)
18 self._boundsMat = numpy.zeros((nf, nf), numpy.float)
19 self._boundsMat2D = numpy.zeros((nf, nf), numpy.int)
20 if initMats:
21 self._initializeMatrices()
22
33
35
36 nf = len(self._feats)
37 for i in range(1, nf):
38 loci = self._feats[i].GetPos()
39 for j in range(i):
40 locj = self._feats[j].GetPos()
41 dist = loci.Distance(locj)
42 self._boundsMat[i,j] = dist
43 self._boundsMat[j,i] = dist
44 for i in range(nf):
45 for j in range(i+1,nf):
46 self._boundsMat2D[i,j] = 1000
47
48
51
54
56 if (i > j):
57 j,i = i,j
58 return self._boundsMat[i, j]
59
61 if (j > i):
62 j,i = i,j
63 return self._boundsMat[i,j]
64
66 " raises ValueError on failure "
67 nf = len(self._feats)
68 if (i < 0) or (i >= nf):
69 raise ValueError, "Index out of bound"
70 if (j < 0) or (j >= nf):
71 raise ValueError, "Index out of bound"
72 return True
73
79
85
87 if (i > j):
88 j,i = i,j
89 return self._boundsMat2D[i, j]
90
92 if (j > i):
93 j,i = i,j
94 return self._boundsMat2D[i,j]
95
96
102
108
110 res = ' '*13
111 for i,iFeat in enumerate(self._feats):
112 res += '% 12s '%iFeat.GetFamily()
113 res += '\n'
114 for i,iFeat in enumerate(self._feats):
115 res += '% 12s '%iFeat.GetFamily()
116 for j,jFeat in enumerate(self._feats):
117 if j<i:
118 res += '% 12.3f '%self.getLowerBound(i,j)
119 elif j>i:
120 res += '% 12.3f '%self.getUpperBound(i,j)
121 else:
122 res += '% 12.3f '%0.0
123 res += '\n'
124 return res
125
127 """ this is a pharmacophore with explicit point locations and radii
128 """
129 - def __init__(self, feats=None,radii=None):
132
147
150
153
155 return self._feats[i]
156
158 return self._radii[i]
159
162
166
169
171 from rdkit.Chem import ChemicalFeatures
172
173 import re
174 spaces = re.compile('[\ \t]+')
175
176 feats = []
177 rads = []
178 for lineNum,line in enumerate(lines):
179 txt = line.split('#')[0].strip()
180 if txt:
181 splitL = spaces.split(txt)
182 if len(splitL)<5:
183 logger.error('Input line %d only contains %d fields, 5 are required. Read failed.'%(lineNum,len(splitL)))
184 return
185 fName = splitL[0]
186 try:
187 xP = float(splitL[1])
188 yP = float(splitL[2])
189 zP = float(splitL[3])
190 rad = float(splitL[4])
191 except ValueError:
192 logger.error('Error parsing a number of line %d. Read failed.'%(lineNum))
193 return
194 feats.append(ChemicalFeatures.FreeChemicalFeature(fName,fName,Geometry.Point3D(xP,yP,zP)))
195 rads.append(rad)
196 self._initializeFeats(feats,rads)
197
199 res = ''
200 for feat,rad in zip(self._feats,self._radii):
201 res += '% 12s '%feat.GetFamily()
202 p = feat.GetPos()
203 res += ' % 8.4f % 8.4f % 8.4f '%(p.x,p.y,p.z)
204 res += '% 5.2f'%rad
205 res += '\n'
206 return res
207