1
2
3
4
5
6
7
8 """ Supplies a class for working with molecules from databases
9 #DOC
10
11 """
12 import Chem
13 from Chem.Suppliers.MolSupplier import MolSupplier
14 import sys
17
19 """
20 new molecules come back with all additional fields from the
21 database set in a "_fieldsFromDb" data member
22
23 """
24 - def __init__(self,dbResults,
25 molColumnFormats={'SMILES':'SMI',
26 'SMI':'SMI',
27 'MOLPKL':'PKL'},
28 nameCol='',**kwargs):
29 """
30
31 DbResults should be a subclass of Dbase.DbResultSet.DbResultBase
32
33 """
34 self._data = dbResults
35 self._colNames = [x.upper() for x in self._data.GetColumnNames()]
36 nameCol = nameCol.upper()
37 self.molCol = -1
38 try:
39 self.nameCol = self._colNames.index(nameCol)
40 except ValueError:
41 self.nameCol = -1
42 for name in molColumnFormats.keys():
43 name = name.upper()
44 try:
45 idx = self._colNames.index(name)
46 except ValueError:
47 pass
48 else:
49 self.molCol = idx
50 self.molFmt = molColumnFormats[name]
51 break
52 if self.molCol < 0:
53 raise ValueError,'DbResultSet has no recognizable molecule column'
54 del self._colNames[self.molCol]
55 self._colNames = tuple(self._colNames)
56 self._numProcessed=0
59
61 data = list(data)
62 molD = data[self.molCol]
63 del data[self.molCol]
64 self._numProcessed+=1;
65 try:
66 if self.molFmt =='SMI':
67 newM = Chem.MolFromSmiles(molD)
68 if not newM:
69 warning('Problems processing mol %d, smiles: %s\n'%(self._numProcessed,molD))
70 elif self.molFmt =='PKL':
71 newM = Chem.Mol(str(molD))
72 except:
73 newM = None
74 else:
75 if newM:
76 newM._fieldsFromDb = data
77 nFields = len(data)
78 for i in range(nFields):
79 newM.SetProp(self._colNames[i],str(data[i]))
80 if self.nameCol >=0 :
81 newM.SetProp('_Name',str(data[self.nameCol]))
82 return newM
83
85 """ DbMol supplier supporting only forward iteration
86
87
88 new molecules come back with all additional fields from the
89 database set in a "_fieldsFromDb" data member
90
91 """
93 """
94
95 DbResults should be an iterator for Dbase.DbResultSet.DbResultBase
96
97 """
98 DbMolSupplier.__init__(self,dbResults,**kwargs)
99 self.Reset()
100
102 self._dataIter = iter(self._data)
103
105 """
106
107 NOTE: this has side effects
108
109 """
110 try:
111 d = self._dataIter.next()
112 except StopIteration:
113 d = None
114 if d is not None:
115 newM = self._BuildMol(d)
116 else:
117 newM = None
118
119 return newM
120
123 """
124
125 DbResults should be a Dbase.DbResultSet.RandomAccessDbResultSet
126
127 """
128 DbMolSupplier.__init__(self,dbResults,**kwargs)
129 self._pos = -1
130
132 return len(self._data)
133
135 newD = self._data[idx]
136 return self._BuildMol(newD)
137
141 self._pos += 1
142 res = None
143 if self._pos < len(self):
144 res = self[self._pos]
145 return res
146