rdkit.Chem.ChemUtils.AlignDepict

Package rdkit :: Package Chem :: Package ChemUtils :: Module AlignDepict |
[hide private]
[frames] | no frames]

# Source Code for Module rdkit.Chem.ChemUtils.AlignDepict

     1  #
     2  #  Copyright (C) 2006 Greg Landrum
     3  #  This file is part of RDKit and covered by $RDBASE/license.txt
     4  #
     5  from __future__ import print_function
     6
     7  import argparse
     8  import sys
     9
    10  from rdkit import Chem
    11  from rdkit import Geometry
    12  from rdkit.Chem import rdDepictor
    13
    14
    15 -def AlignDepict(mol, core, corePattern=None, acceptFailure=False):
    16    """
    17    Arguments:
    18      - mol:          the molecule to be aligned, this will come back
    19                      with a single conformer.
    20      - core:         a molecule with the core atoms to align to;
    21                      this should have a depiction.
    22      - corePattern:  (optional) an optional molecule to be used to
    23                      generate the atom mapping between the molecule
    24                      and the core.
    25    """
    26    if core and corePattern:
    27      if not core.GetNumAtoms(onlyExplicit=True) == corePattern.GetNumAtoms(onlyExplicit=True):
    28        raise ValueError(
    29          'When a pattern is provided, it must have the same number of atoms as the core')
    30      coreMatch = core.GetSubstructMatch(corePattern)
    31      if not coreMatch:
    32        raise ValueError("Core does not map to itself")
    33    else:
    34      coreMatch = list(range(core.GetNumAtoms(onlyExplicit=True)))
    35    if corePattern:
    36      match = mol.GetSubstructMatch(corePattern)
    37    else:
    38      match = mol.GetSubstructMatch(core)
    39
    40    if not match:
    41      if not acceptFailure:
    42        raise ValueError('Substructure match with core not found.')
    43      else:
    44        coordMap = {}
    45    else:
    46      conf = core.GetConformer()
    47      coordMap = {}
    48      for i, idx in enumerate(match):
    49        pt3 = conf.GetAtomPosition(coreMatch[i])
    50        pt2 = Geometry.Point2D(pt3.x, pt3.y)
    51        coordMap[idx] = pt2
    52    rdDepictor.Compute2DCoords(mol, clearConfs=True, coordMap=coordMap, canonOrient=False)
    53
    54
    55 -def initParser():
    56    """ Initialize the parser """
    57    parser = argparse.ArgumentParser(description='Create aligned depiction')
    58    parser.add_argument('--pattern', '-p', metavar='SMARTS', default=None, dest='patt')
    59    parser.add_argument('--smiles', default=False, action='store_true', dest='useSmiles',
    60                        help='Set if core and input are SMILES strings')
    61    parser.add_argument('-o', dest='outF', type=argparse.FileType('w'), default=sys.stdout,
    62                        metavar='OUTFILE',
    63                        help='Specify a file to take the output. If missing, uses stdout.')
    64    parser.add_argument('core', metavar='core')
    65    parser.add_argument('mol', metavar='molecule', help='')
    66    return parser
    67
    68
    69 -def processArgs(args):
    70    patt = args.patt
    71    if patt:
    72      patt = Chem.MolFromSmarts(patt)
    73
    74    if args.useSmiles:
    75      core = Chem.MolFromSmiles(args.core)
    76      mol = Chem.MolFromSmiles(args.mol)
    77      rdDepictor.Compute2DCoords(core)
    78    else:
    79      core = Chem.MolFromMolFile(args.core)
    80      mol = Chem.MolFromMolFile(args.mol)
    81
    82    AlignDepict(mol, core, patt)
    83    print(Chem.MolToMolBlock(mol), file=args.outF)
    84
    85
    86 -def main():
    87    """ Main application """
    88    parser = initParser()
    89    args = parser.parse_args()
    90    processArgs(args)
    91
    92
    93  if __name__ == '__main__':
    94    main()
    95