Source code for prody.apps.prody_apps.prody_contacts
# -*- coding: utf-8 -*-
"""This module defines a routine for contact identification."""
from ..apptools import *
__all__ = ['prody_contacts']
[docs]def prody_contacts(**kwargs):
"""Identify contacts of a target structure with one or more ligands.
Contacting atoms (or extended subset of atoms, such as residues) are
outputted in PDB file format.
:arg target: target PDB identifier or filename
:arg ligand: ligand PDB identifier(s) or filename(s)
:arg select: atom selection string for target structure
:arg radius: contact radius (Å), default is ``4.0``
:arg extend: output same ``'residue'``, ``'chain'``, or ``'segment'`` along
with contacting atoms
:arg prefix: prefix for output file, default is *target* filename
:arg suffix: output filename suffix, default is *ligand* filename"""
import prody
LOGGER = prody.LOGGER
target = prody.parsePDB(kwargs['target'])
title = kwargs.get('prefix') or target.getTitle()
selstr = kwargs.get('select')
if selstr:
target = target.select(selstr)
contacts = prody.Contacts(target)
suffix = kwargs.get('suffix', '_contacts')
extend = kwargs.get('extend')
radius = float(kwargs.get('radius', 4.0))
ligands = kwargs.get('ligand')
if len(ligands) > 1:
outfn = lambda fn: title + suffix + '_' + fn + '.pdb'
else:
outfn = lambda fn: title + suffix + '.pdb'
for pdb in ligands:
ligand = prody.parsePDB(pdb)
sel = contacts(radius, ligand)
if sel:
LOGGER.info('{0} atoms from {1} contact {2}.'
.format(len(sel), pdb, str(target)))
if extend:
sel = target.select('same ' + extend + ' as sel', sel=sel)
LOGGER.info('Selection is extended to {0} atoms of the same '
'{1}(s).'.format(len(sel), extend))
pdbfn = outfn(ligand.getTitle())
LOGGER.info('Writing contacts into ' + pdbfn)
prody.writePDB(pdbfn, sel)
def addCommand(commands):
subparser = commands.add_parser('contacts',
help='identify contacts between a target and ligand(s)')
subparser.add_argument('--quiet', help="suppress info messages to stderr",
action=Quiet, nargs=0)
subparser.add_argument('--examples', action=UsageExample, nargs=0,
help='show usage examples and exit')
subparser.set_defaults(usage_example=
"""Identify contacts of a target structure with one or more ligands.
Fetch PDB structure 1zz2, save PDB files for individual ligands, and identify \
contacting residues of the target protein:
$ prody select -o B11 "resname B11" 1zz2
$ prody select -o BOG "resname BOG" 1zz2
$ prody contacts -r 4.0 -t residue -s protein 1zz2 B11.pdb BOG.pdb
""",
test_examples=[(0,1,2)]
)
subparser.add_argument('-s', '--select', dest='select', type=str,
metavar='SELSTR', help='selection string for target')
subparser.add_argument('-r', '--radius', dest='radius', type=float,
default=4.0, metavar='FLOAT',
help='contact radius (default: %(default)s)')
subparser.add_argument('-t', '--extend', dest='extend', type=str,
metavar='STR', choices=set(['residue', 'chain', 'segment']),
help=('output same residue, chain, or segment as contacting atoms'))
subparser.add_argument('-p', '--prefix', dest='prefix', type=str,
metavar='STR',
help=('output filename prefix (default: target filename)'))
subparser.add_argument('-x', '--suffix', dest='suffix', type=str,
default='_contacts', metavar='STR',
help=('output filename suffix (default: %(default)s)'))
subparser.add_argument('target',
help='target PDB identifier or filename')
subparser.add_argument('ligand', nargs='+',
help='ligand PDB identifier(s) or filename(s)')
subparser.set_defaults(func=lambda opt: prody_contacts(**opt.__dict__))
subparser.set_defaults(subparser=subparser)