On Fri, Sep 15, 2017 at 9:25 AM, Michał Nowotka <mmm...@gmail.com> wrote:
> 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?
Sure, here's an example GIST with the code:
https://gist.github.com/greglandrum/431483ac1f9edb03b09c8577031c10e0
-greg
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