Dear James,

On Mon, Jul 5, 2010 at 12:31 PM, James Davidson <j.david...@vernalis.com> wrote:
>
> I have been exploring some interactivity between PyMOL and RDKit recently,
> and at the moment am ferrying molecules between the two in MOL format.
> However, I have come up against a bit of a problem that I wondered if anyone
> could help with?
>
> PyMOL does a pretty good job of setting bond valences automatically for
> ligands read-in as part of PDB files, and most of the time these ligands
> exported in MOL format are recognised fine by RDKit (a little bit of parsing
> is necessary to change things like 'Cl' being capitalised in some PDB files,
> etc!).  However, it seems that when there is ambiguity about how to
> tautomerise 5-membered heteroaromatics, RDKit fails to create a mol object
> from the molfile.  I have included an example Molfile below (a
> pyrazolopyrimidine).
>
> Ideally (from my point of view at least!) it would be great if in these
> situations RDKit yielded an arbitrary explicit H to 'mend' the problem.
> However, I am definitely open to workaround suggestions (including "go post
> on the PyMOL lists" :-)  ).  Maybe this is something that is relatively
> trivial to tackle using PyMOL's ChemPy module? (which I know very little
> about!).

As long as it's really ok that the tautomer you get is arbitrary, the
following code snippet might help :
#------------------------------------------------
def AdjustAromaticNs(m):
    matches = [x[0] for x in m.GetSubstructMatches(Chem.MolFromSmarts('n'))]
    foundOne=False
    for idx in matches:
        nm = Chem.Mol(m.ToBinary())
        nm.GetAtomWithIdx(idx).SetNoImplicit(True)
        nm.GetAtomWithIdx(idx).SetNumExplicitHs(1)
        try:
            Chem.SanitizeMol(nm)
        except:
            continue
        else:
            foundOne=True
            break
    if foundOne:
        return nm
    else:
        return None
#------------------------------------------------

Use it like this:
#-----------
    m = Chem.MolFromMolBlock(mb,False)
    try:
        Chem.SanitizeMol(m)
    except ValueError:
        nm=AdjustAromaticNs(m)
        if nm is not None:
            print Chem.MolToSmiles(nm)
#-------------

One could imagine making this more efficient or adding heuristics to
try and find the right answer more efficiently, but this ought to at
least get you started.

-greg

------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Rdkit-discuss mailing list
Rdkit-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss

Reply via email to