rdkit: Draw.DrawMorganBits(Pyrene) gives error

Configuration:

  • RDKit Version: 2019.09.3
  • Operating system: Win 10
  • Python version (if relevant): 3.7
  • Are you using conda? yes
  • If you are using conda, which channel did you install the rdkit from?

Description:

If I run

mol = Chem.MolFromSmiles(smiles)
dic = {}
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=5000, bitInfo=dic)
fp_arr = np.zeros(1,)
DataStructs.ConvertToNumpyArray(fp, fp_arr)
fp_arr = np.nonzero(fp_arr)
prints = [(mol_list[num], x, dic) for x in fp.GetOnBits()]
img = Draw.DrawMorganBits(prints, molsPerRow=10, legends=[str(x) for x in fp.GetOnBits()])
img.save('bits.png')

on > 100 different molecules I can extract the finger print bits and visualize the images of them, but once I try to get the fingerprints for a molecule containing a pyrene in it I recieve an error like the one below…

Traceback (most recent call last):
  File "C:/Users/computer/PycharmProjects/untitled5/venv/rdkit_test.py", line 42, in <module>
    img = Draw.DrawMorganBits(prints, molsPerRow=10, legends=[str(x) for x in fp.GetOnBits()])
  File "C:\Users\computer\Anaconda3\envs\my-rdkit-env\lib\site-packages\rdkit\Chem\Draw\IPythonConsole.py", line 248, in DrawMorganBits
    return _DrawBit(fn, *args, drawOptions=drawOptions, **kwargs)
  File "C:\Users\computer\Anaconda3\envs\my-rdkit-env\lib\site-packages\rdkit\Chem\Draw\IPythonConsole.py", line 206, in _DrawBit
    res = fn(*args, **kwargs)
  File "C:\Users\computer\Anaconda3\envs\my-rdkit-env\lib\site-packages\rdkit\Chem\Draw\__init__.py", line 600, in DrawMorganBits
    return DrawMorganEnvs(envs, **kwargs)
  File "C:\Users\computer\Anaconda3\envs\my-rdkit-env\lib\site-packages\rdkit\Chem\Draw\__init__.py", line 724, in DrawMorganEnvs
    highlightBondColors=bondColors, highlightAtomRadii=highlightRadii, **kwargs)
rdkit.Chem.rdchem.KekulizeException: Can't kekulize mol.  Unkekulized atoms: 0 1 2 3 4 5 6 7 8 9 11 12 13
Your code sample here

About this issue

  • Original URL
  • State: open
  • Created 4 years ago
  • Comments: 15 (6 by maintainers)

Most upvoted comments

@jhjensen2 Hi Jan, here’s a monkey patch you can use to avoid the problem:

from rdkit import Chem
from rdkit.Chem import Draw, rdMolDescriptors

if not hasattr(Draw, '_getMorganEnvPatched'):
    _getMorganEnv = Draw._getMorganEnv
    def _getMorganEnvPatched(*args, **kwargs):
        menv = _getMorganEnv(*args, **kwargs)
        menv_dict = menv._asdict()
        try:
            _submol = Draw.PrepareMolForDrawing(menv.submol)
        except Chem.KekulizeException:
            _submol = Draw.PrepareMolForDrawing(menv.submol, kekulize=False)
        menv_dict['submol'] = _submol
        return Draw.FingerprintEnv(**menv_dict)
    Draw._getMorganEnvPatched = _getMorganEnvPatched
    Draw._getMorganEnv = Draw._getMorganEnvPatched

mol = Chem.MolFromSmiles('[O-]c1cc(C[C@H]2C[NH2+]CCO2)nc2nc(-c3ccccc3Cl)nn12')
bi = {}
fp = rdMolDescriptors.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=2048, bitInfo=bi)
tpls = [(mol,x,bi) for x in fp.GetOnBits()]
drawOptions = Draw.rdMolDraw2D.MolDrawOptions()
drawOptions.continuousHighlight = False
drawOptions.includeMetadata = False
drawOptions.prepareMolsBeforeDrawing = False
Draw.DrawMorganBits(tpls,molsPerRow=8,legends=[str(x) for x in fp.GetOnBits()], useSVG=True, drawOptions=drawOptions)

image