1
2
3
4
5
6 import os
7 from rdkit.six import iteritems
8 from rdkit.Chem.Draw.MolDrawing import MolDrawing,DrawingOptions
9 from rdkit.Chem.Draw.rdMolDraw2D import *
10
41
56
57 -def MolToImage(mol, size=(300,300), kekulize=True, wedgeBonds=True,
58 fitImage=False, options=None, canvas=None, **kwargs):
59 """Returns a PIL image containing a drawing of the molecule
60
61 ARGUMENTS:
62
63 - kekulize: run kekulization routine on input `mol` (default True)
64
65 - size: final image size, in pixel (default (300,300))
66
67 - wedgeBonds: draw wedge (stereo) bonds (default True)
68
69 - highlightAtoms: list of atoms to highlight (default [])
70
71 - highlightMap: dictionary of (atom, color) pairs (default None)
72
73 - highlightBonds: list of bonds to highlight (default [])
74
75 - highlightColor: RGB color as tuple (default [1, 0, 0])
76
77 NOTE:
78
79 use 'matplotlib.colors.to_rgb()' to convert string and
80 HTML color codes into the RGB tuple representation, eg.
81
82 from matplotlib.colors import ColorConverter
83 img = Draw.MolToImage(m, highlightAtoms=[1,2], highlightColor=ColorConverter().to_rgb('aqua'))
84 img.save("molecule.png")
85
86 RETURNS:
87
88 a PIL Image object
89 """
90
91 if not mol:
92 raise ValueError('Null molecule provided')
93 if canvas is None:
94 img,canvas=_createCanvas(size)
95 else:
96 img=None
97
98 if options is None:
99 options = DrawingOptions()
100 if fitImage:
101 options.dotsPerAngstrom = int(min(size) / 10)
102 options.wedgeDashedBonds = wedgeBonds
103 if 'highlightColor' in kwargs:
104 color = kwargs.pop('highlightColor', (1, 0, 0))
105 options.selectColor = color
106
107 drawer = MolDrawing(canvas=canvas,drawingOptions=options)
108
109 if kekulize:
110 from rdkit import Chem
111 mol = Chem.Mol(mol.ToBinary())
112 Chem.Kekulize(mol)
113
114 if not mol.GetNumConformers():
115 from rdkit.Chem import AllChem
116 AllChem.Compute2DCoords(mol)
117
118 if 'legend' in kwargs:
119 legend = kwargs['legend']
120 del kwargs['legend']
121 else:
122 legend=''
123
124 drawer.AddMol(mol,**kwargs)
125
126 if legend:
127 from rdkit.Chem.Draw.MolDrawing import Font
128 bbox = drawer.boundingBoxes[mol]
129 pos = size[0]/2,int(.94*size[1]),0
130
131
132
133
134 font=Font(face='sans',size=12)
135 canvas.addCanvasText(legend,pos,font)
136
137 if kwargs.get('returnCanvas',False):
138 return img,canvas,drawer
139 else:
140 canvas.flush()
141 return img
142
143 -def MolToFile(mol,fileName,size=(300,300),kekulize=True, wedgeBonds=True,
144 imageType=None, fitImage=False, options=None, **kwargs):
183
184 -def MolToImageFile(mol,filename,size=(300,300),kekulize=True, wedgeBonds=True,
185 **kwargs):
186 """ DEPRECATED: please use MolToFile instead
187
188 """
189 img = MolToImage(mol,size=size,kekulize=kekulize,wedgeBonds=wedgeBonds,**kwargs)
190 img.save(filename)
191
192 tkRoot=None
193 tkLabel=None
194 tkPI=None
195 -def ShowMol(mol,size=(300,300),kekulize=True,wedgeBonds=True,
196 title='RDKit Molecule',**kwargs):
197 """ Generates a picture of a molecule and displays it in a Tkinter window
198 """
199 global tkRoot,tkLabel,tkPI
200 import Tkinter
201 try:
202 import ImageTk
203 except ImportError:
204 from PIL import ImageTk
205
206 img = MolToImage(mol,size,kekulize,wedgeBonds,**kwargs)
207
208 if not tkRoot:
209 tkRoot = Tkinter.Tk()
210 tkRoot.title(title)
211 tkPI = ImageTk.PhotoImage(img)
212 tkLabel = Tkinter.Label(tkRoot,image=tkPI)
213 tkLabel.place(x=0,y=0,width=img.size[0],height=img.size[1])
214 else:
215 tkPI.paste(img)
216 tkRoot.geometry('%dx%d'%(img.size))
217
218
219 -def MolToMPL(mol,size=(300,300),kekulize=True, wedgeBonds=True,
220 imageType=None, fitImage=False, options=None, **kwargs):
250
252 """
253 useful things to do with these:
254 fig.axes[0].imshow(z,cmap=cm.gray,interpolation='bilinear',origin='lower',extent=(0,1,0,1))
255 fig.axes[0].contour(x,y,z,20,colors='k')
256
257 fig=Draw.MolToMPL(m);
258 contribs=Crippen.rdMolDescriptors._CalcCrippenContribs(m)
259 logps,mrs=zip(*contribs)
260 x,y,z=Draw.calcAtomGaussians(m,0.03,step=0.01,weights=logps)
261 fig.axes[0].imshow(z,cmap=cm.jet,interpolation='bilinear',origin='lower',extent=(0,1,0,1))
262 fig.axes[0].contour(x,y,z,20,colors='k',alpha=0.5)
263 fig.savefig('coumlogps.colored.png',bbox_inches='tight')
264
265
266 """
267 import numpy
268 from matplotlib import mlab
269 x = numpy.arange(0,1,step)
270 y = numpy.arange(0,1,step)
271 X,Y = numpy.meshgrid(x,y)
272 if weights is None:
273 weights=[1.]*mol.GetNumAtoms()
274 Z = mlab.bivariate_normal(X,Y,a,a,mol._atomPs[0][0], mol._atomPs[0][1])*weights[0]
275 for i in range(1,mol.GetNumAtoms()):
276 Zp = mlab.bivariate_normal(X,Y,a,a,mol._atomPs[i][0], mol._atomPs[i][1])
277 Z += Zp*weights[i]
278 return X,Y,Z
279
280
281 -def MolsToImage(mols, subImgSize=(200,200),legends=None,**kwargs):
282 """
283 """
284 try:
285 import Image
286 except ImportError:
287 from PIL import Image
288 if legends is None: legends = [None]*len(mols)
289 res = Image.new("RGBA",(subImgSize[0]*len(mols),subImgSize[1]))
290 for i,mol in enumerate(mols):
291 res.paste(MolToImage(mol,subImgSize,legend=legends[i],**kwargs),(i*subImgSize[0],0))
292 return res
293
294
295 -def MolsToGridImage(mols,molsPerRow=3,subImgSize=(200,200),legends=None,
296 highlightAtomLists=None,**kwargs):
297 """
298 """
299 try:
300 import Image
301 except ImportError:
302 from PIL import Image
303 if legends is None: legends = [None]*len(mols)
304
305 nRows = len(mols)//molsPerRow
306 if len(mols)%molsPerRow : nRows+=1
307
308 res = Image.new("RGBA",(molsPerRow*subImgSize[0],nRows*subImgSize[1]),(255,255,255,0))
309 for i,mol in enumerate(mols):
310 row = i//molsPerRow
311 col = i%molsPerRow
312 highlights=None
313 if highlightAtomLists and highlightAtomLists[i]:
314 highlights=highlightAtomLists[i]
315 res.paste(MolToImage(mol,subImgSize,legend=legends[i],highlightAtoms=highlights,
316 **kwargs),(col*subImgSize[0],row*subImgSize[1]))
317 return res
318
320 """
321 """
322 try:
323 import Image
324 except ImportError:
325 from PIL import Image
326
327 mols = []
328 for i in range(rxn.GetNumReactantTemplates()):
329 tmpl=rxn.GetReactantTemplate(i)
330 tmpl.UpdatePropertyCache(False)
331 mols.append(tmpl)
332 mols.append(None)
333 for i in range(rxn.GetNumProductTemplates()):
334 tmpl = rxn.GetProductTemplate(i)
335 tmpl.UpdatePropertyCache(False)
336 mols.append(tmpl)
337
338 res = Image.new("RGBA",(subImgSize[0]*len(mols),subImgSize[1]),(255,255,255,0))
339 for i,mol in enumerate(mols):
340 if mol is not None:
341 nimg = MolToImage(mol,subImgSize,kekulize=False,**kwargs)
342 else:
343 nimg,canvas = _createCanvas(subImgSize)
344 p0 = (10,subImgSize[1]//2)
345 p1 = (subImgSize[0]-10,subImgSize[1]//2)
346 p3 = (subImgSize[0]-20,subImgSize[1]//2-10)
347 p4 = (subImgSize[0]-20,subImgSize[1]//2+10)
348 canvas.addCanvasLine(p0,p1,lineWidth=2,color=(0,0,0))
349 canvas.addCanvasLine(p3,p1,lineWidth=2,color=(0,0,0))
350 canvas.addCanvasLine(p4,p1,lineWidth=2,color=(0,0,0))
351 if hasattr(canvas,'flush'):
352 canvas.flush()
353 else:
354 canvas.save()
355 res.paste(nimg,(i*subImgSize[0],0))
356 return res
357
358
359 -def MolToQPixmap(mol, size=(300,300), kekulize=True, wedgeBonds=True,
360 fitImage=False, options=None, **kwargs):
384