Thanks Greg, very helpful! Can you tell me how should I modify my code to provide the list of bonds to be highlighted, so I get the image generated by DrawMolecules looking the same way as produced by DrawMolecule?
On Thu, Sep 14, 2017 at 4:36 PM, Greg Landrum <greg.land...@gmail.com> wrote: > Hi Michal, > > There are a couple of things in here. > > On Fri, Aug 25, 2017 at 11:42 AM, Michał Nowotka <mmm...@gmail.com> wrote: >> >> Hi, >> >> I finally decided to try the new C++ drawing code and I found some >> issues with it. I'll try to descibe my problems. >> >> First, lets start with a code that works perfectly: >> >> from rdkit import Chem >> from rdkit.Chem.AllChem import Compute2DCoords >> from rdkit.Chem.Draw import rdMolDraw2D >> >> m = Chem.MolFromSmiles('O=C(C)Oc1ccccc1C(=O)O') >> Compute2DCoords(m) >> drawer = rdMolDraw2D.MolDraw2DCairo(500, 500) >> >> drawer.DrawMolecule(m,highlightAtoms=m.GetSubstructMatch(Chem.MolFromSmarts('c1ccccc1'))) >> drawer.FinishDrawing() >> with open('aspirin_a.png','wb') as f: >> f.write(drawer.GetDrawingText()) >> >> This code produces the attached 'aspirin_a.png' image, that looks perfect. > > > Yay! :-) > >> >> Now, apart from the `DrawMolecule` there is also `DrawMolecules` >> function exposed by the `MolDraw2DCairo` module. So what will happen >> when I use it to render the same molecule? >> >> from rdkit import Chem >> from rdkit.Chem.AllChem import Compute2DCoords >> from rdkit.Chem.Draw import rdMolDraw2D >> >> m = Chem.MolFromSmiles('O=C(C)Oc1ccccc1C(=O)O') >> Compute2DCoords(m) >> drawer = rdMolDraw2D.MolDraw2DCairo(500, 500) >> >> drawer.DrawMolecules([m],highlightAtoms=[m.GetSubstructMatch(Chem.MolFromSmarts('c1ccccc1'))]) >> drawer.FinishDrawing() >> with open('aspirin_b.png','wb') as f: >> f.write(drawer.GetDrawingText()) >> >> >> The image is different - only atoms are highlighted, bonds between >> atoms are not (see the attached 'aspirin_b.png') image. > > > Short answer: DrawMolecules() requires you to provide the list of bonds to > be highlighted too. This is just a couple of lines of code. > >> >> OK, but who would use `DrawMolecules` to render a single compound >> anyway? I think it's meant to render multiple compounds at once. The >> 'old' drawing code has a function called `MolsToGridImage` to do this. >> And it has a `molsPerRow` parameter which makes it easy to define a >> shape of the grid. I couldn't find a similar function in the 'new' >> drawing code so it looks like using `DrawMolecules` is the only way to >> render multiple mols at once. Let's try that: >> >> from rdkit import Chem >> from rdkit.Chem.AllChem import Compute2DCoords >> from rdkit.Chem.Draw import rdMolDraw2D >> >> m1 = Chem.MolFromSmiles('O=C(C)Oc1ccccc1C(=O)O') >> Compute2DCoords(m1) >> m2 = Chem.MolFromSmiles('c1cccnc1O') >> Compute2DCoords(m2) >> drawer = rdMolDraw2D.MolDraw2DCairo(500, 500) >> drawer.DrawMolecules([m1, m2]) >> drawer.FinishDrawing() >> with open('mols.png','wb') as f: >> f.write(drawer.GetDrawingText()) > > > The MolDraw2D constructors can be called with additional arguments that > provide the size of the panes used to render grids of molecules. > For example, here's the code to draw two molecules side by side derived from > your example: > from rdkit import Chem > from rdkit.Chem.Draw import rdMolDraw2D > > m1 = Chem.MolFromSmiles('O=C(C)Oc1ccccc1C(=O)O') > pm1 = rdMolDraw2D.PrepareMolForDrawing(m1) > m2 = Chem.MolFromSmiles('c1cccnc1O') > pm2 = rdMolDraw2D.PrepareMolForDrawing(m2) > drawer = rdMolDraw2D.MolDraw2DCairo(600,300,300,300) > drawer.DrawMolecules([m1, m2]) > drawer.FinishDrawing() > with open('mols.png','wb') as f: > f.write(drawer.GetDrawingText()) > > > I've switched to use PrepareMolForDrawing() (because I think it's nice to > have kekule structures and wedged bonds) and provided a canvas size of > 600x300 divided into 300x300 panels. The code figures out that this means 2 > mols per row. > > It's somewhat curious (and I don't mean that in a good way) that this hasn't > made it onto the RDKit master yet (instead of using the hack that's > currently there). I will try to get that done before the next release. > > To summarize: >> >> >> - `DrawMolecules` doesn't highlight bonds in the same way as the >> `DrawMolecule` does > > > correct. That's by design (correct method described above) > >> - There is no equivalent of the `MolsToGridImage` where I can define >> the shape of the grid of molecules at least nothing documented in >> >> http://www.rdkit.org/Python_Docs/rdkit.Chem.Draw.rdMolDraw2D.MolDraw2D-class.html > > > Right, it's not documented, but hopefully what I have above helps you see > how to do it. >> >> >> - `DrawMolecules` does nothing to layout molecules in such a way that >> they don't obscure each other > > > Correct. It does what you tell it to do, but hopefully the rest of the > answer tells you how to tell it the right thing. > > -greg > > >> >> >> Regards, >> >> Michał Nowotka >> >> >> ------------------------------------------------------------------------------ >> Check out the vibrant tech community on one of the world's most >> engaging tech sites, Slashdot.org! http://sdm.link/slashdot >> _______________________________________________ >> Rdkit-discuss mailing list >> Rdkit-discuss@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/rdkit-discuss >> > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Rdkit-discuss mailing list Rdkit-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rdkit-discuss