"""Pfam search application."""
__author__ = 'Ahmet Bakan, Anindita Dutta'
from ..apptools import DevelApp
__all__ = ['evol_search']
APP = DevelApp('search', 'search Pfam with given query')
APP.addGroup('sequence', 'sequence search options')
APP.addGroup('output', 'output options')
APP.addArgument('query',
help='protein UniProt ID or sequence, a PDB identifier, or a sequence '
'file, where sequence have no gaps and 12 or more characters')
APP.addArgument('-b', '--searchBs',
dest='search_b',
help='search Pfam-B families',
default=False,
action='store_true',
group='sequence')
APP.addArgument('-s', '--skipAs',
dest='skip_a',
help='do not search Pfam-A families',
default=False,
action='store_true',
group='sequence')
APP.addArgument('-g', '--ga',
dest='ga',
help='use gathering threshold',
default=False,
action='store_true',
group='sequence')
APP.addArgument('-e', '--evalue',
dest='evalue',
help='e-value cutoff, must be less than 10.0',
default=None,
type=float,
metavar='FLOAT',
group='sequence')
APP.addArgument('-t', '--timeout',
dest='timeout',
help='timeout in seconds for blocking connection attempt',
default=60,
type=int,
metavar='INT',
group='sequence')
APP.addArgument('-o', '--outname',
dest='outname',
help='name for output file, default is standard output',
type=str,
metavar='STR',
group='output')
APP.addArgument('-d', '--delimiter',
dest='delimiter',
type=str,
default='\t',
metavar='STR',
help='delimiter for output data columns',
group='output')
APP.setExample(
"""Search Pfam database with a UniProt ID or protein sequence.
Sequence input can be parsed from a FASTA or Selex. Minimum length
of query sequence should be 16 characters and should not contain gaps.
If output name is specified, results will be written in a file.
Otherwise, or the output will be directed to standard output.
Search Pfam with PDB and chain identifier and output results to screen:
$ evol search 1mkpA
Search Pfam with UniProt ID and write output into a file:
$ evol search P08581 --outname families.txt
Search Pfam with a sequence and with some search options:
$ evol search PMFIVNTNVPRASVPDGFLSELTQQLAQATGKPPQYIAVHVVPDQLMAFGGSSEPCALCS\
LHSIGKIGGAQNRSYSKLLCGLLAERLRISPDRVYINYYDMNAANVGWNNSTFA --evalue 2 \
--searchBs""", [0, 1])
[docs]def evol_search(query, **kwargs):
import prody
from os.path import join, split
pfam_results = prody.searchPfam(query, **kwargs)
if pfam_results is None:
return
outname = kwargs.get('outname', None)
delimiter = kwargs.get('delimiter', '\t')
if outname:
folder, outname = split(outname)
filepath = join(prody.utilities.makePath(folder), outname)
out = open(filepath, 'wb')
else:
from sys import stdout as out
title = delimiter.join(['acc', 'id', 'type', 'e-value']) + '\n'
out.write(title)
for key in pfam_results:
val = pfam_results[key]
evalue = ''
for i, location in enumerate(val.get('locations', [])):
temp = location.get('evalue', None)
if temp:
if i==0:
evalue = float(temp)
else:
if float(temp) < evalue:
evalue = float(temp)
output = delimiter.join([val.get('accession', ' '),
val.get('id', ' '),
val.get('type', ' '),
str(evalue)]) + '\n'
out.write(output)
if outname:
prody.LOGGER.info('Search results written in {0}.'.format(filepath))
out.close()
APP.setFunction(evol_search)