Package rdkit :: Package Chem :: Module TemplateAlign

[hide private]
[frames] | no frames]

# Source Code for Module rdkit.Chem.TemplateAlign

      1  # $Id$
      2  #
      3  #  Copyright (C) 2005-2006 Rational Discovery LLC
      4  #
      5  #   @@ All Rights Reserved @@
      6  #  This file is part of the RDKit.
      7  #  The contents are covered by the terms of the BSD license
      8  #  which is included in the file license.txt, found at the root
      9  #  of the RDKit source tree.
     10  #
     11  from rdkit import Chem
     12  from rdkit.Chem import rdDepictor
     13  from rdkit import Geometry
     14
     15 -def AlignMolToTemplate2D(mol,template,match=None,clearConfs=False,
     16                           templateConfId=-1,):
     17    """
     18     Arguments:
     19
     20       - mol:      the molecule to be aligned
     21       - template: the template to align to
     22       - match:    If provided, this should be a sequence of integers
     23                   containing the indices of the atoms in mol that match
     24                   those in template. This is the result of calling:
     25                     mol.GetSubstructMatch(template)
     26       - clearConfs: toggles removing any existing conformers on mol
     27
     28      Returns the confId of the conformer containing the depiction
     29
     30      >>> patt = Chem.MolFromSmiles('C1CC1')
     31      >>> rdDepictor.Compute2DCoords(patt)
     32      0
     33      >>> mol = Chem.MolFromSmiles('OC1CC1CC1CCC1')
     34      >>> rdDepictor.Compute2DCoords(mol)
     35      0
     36      >>> pc = patt.GetConformer(0)
     37      >>> mc = mol.GetConformer(0)
     38
     39      We start out with the molecules not aligned:
     40      >>> vs = [abs(pc.GetAtomPosition(i).x-mc.GetAtomPosition(i+1).x) for i in range(pc.GetNumAtoms())]
     41      >>> [x<1e-4 for x in vs]
     42      [False, False, False]
     43
     44      But then we can replace the conformer of mol:
     45      >>> AlignMolToTemplate2D(mol,patt,clearConfs=True)
     46      0
     47      >>> mol.GetNumConformers()
     48      1
     49      >>> pc = patt.GetConformer(0)
     50      >>> mc = mol.GetConformer(0)
     51      >>> vs = [abs(pc.GetAtomPosition(i).x-mc.GetAtomPosition(i+1).x) for i in range(pc.GetNumAtoms())]
     52      >>> [x<1e-4 for x in vs]
     53      [True, True, True]
     54
     55      If we like, we can specify the atom map explicitly in order to align to the second
     56      matching ring in the probe molecule:
     57      >>> match = (5,6,7)
     58      >>> AlignMolToTemplate2D(mol,patt,clearConfs=True,match=match)
     59      0
     60      >>> mol.GetNumConformers()
     61      1
     62      >>> pc = patt.GetConformer(0)
     63      >>> mc = mol.GetConformer(0)
     64      >>> vs = [abs(pc.GetAtomPosition(i).x-mc.GetAtomPosition(i+1).x) for i in range(pc.GetNumAtoms())]
     65      >>> [x<1e-4 for x in vs]
     66      [False, False, False]
     67      >>> vs = [abs(pc.GetAtomPosition(i).x-mc.GetAtomPosition(i+5).x) for i in range(pc.GetNumAtoms())]
     68      >>> [x<1e-4 for x in vs]
     69      [True, True, True]
     70
     71
     72
     73    """
     74    if not match:
     75      match = mol.GetSubstructMatch(template)
     76    if not match:
     77      raise ValueError('no match between mol and template')
     78
     79    atomMap = {}
     80    templateConf = template.GetConformer(templateConfId)
     81    for i,idx in enumerate(match):
     82      p = templateConf.GetAtomPosition(i)
     83      atomMap[idx] = Geometry.Point2D(p.x,p.y)
     84    molConfId = rdDepictor.Compute2DCoords(mol,clearConfs=clearConfs,coordMap=atomMap)
     85    return molConfId
     86
     87
     88  #------------------------------------
     89  #
     90  #  doctest boilerplate
     91  #
     92 -def _test():
     93    import doctest,sys
     94    return doctest.testmod(sys.modules["__main__"])
     95
     96
     97  if __name__ == '__main__':
     98    import sys
     99    failed,tried = _test()
    100    sys.exit(failed)
    101