# Copyright 2014 by Kevin Wu. # Revisions copyright 2014 by Peter Cock. # All rights reserved. # # This file is part of the Biopython distribution and governed by your # choice of the "Biopython License Agreement" or the "BSD 3-Clause License". # Please see the LICENSE file that should have been included as part of this # package. """Provides code to access the REST-style KEGG online API. This module aims to make the KEGG online REST-style API easier to use. See: http://www.kegg.jp/kegg/rest/keggapi.html The KEGG REST-style API provides simple access to a range of KEGG databases. This works using simple URLs (which this module will construct for you), with any errors indicated via HTTP error levels. The functionality is somewhat similar to Biopython's Bio.TogoWS and Bio.Entrez modules. Currently KEGG does not provide any usage guidelines (unlike the NCBI whose requirements are reasonably clear). To avoid risking overloading the service, Biopython will only allow three calls per second. References: Kanehisa, M. and Goto, S.; KEGG: Kyoto Encyclopedia of Genes and Genomes. Nucleic Acids Res. 28, 29-34 (2000). """ from Bio._py3k import urlopen as _urlopen from Bio._py3k import _binary_to_string_handle def _q(op, arg1, arg2=None, arg3=None): URL = "http://rest.kegg.jp/%s" if arg2 and arg3: args = "%s/%s/%s/%s" % (op, arg1, arg2, arg3) elif arg2: args = "%s/%s/%s" % (op, arg1, arg2) else: args = "%s/%s" % (op, arg1) resp = _urlopen(URL % (args)) if "image" == arg2: return resp return _binary_to_string_handle(resp) # http://www.kegg.jp/kegg/rest/keggapi.html def kegg_info(database): """KEGG info - Displays the current statistics of a given database. db - database or organism (string) The argument db can be a KEGG database name (e.g. 'pathway' or its official abbreviation, 'path'), or a KEGG organism code or T number (e.g. 'hsa' or 'T01001' for human). A valid list of organism codes and their T numbers can be obtained via kegg_info('organism') or http://rest.kegg.jp/list/organism """ # TODO - return a string (rather than the handle?) # TODO - chache and validate the organism code / T numbers? # TODO - can we parse the somewhat formatted output? # # http://rest.kegg.jp/info/ # # = pathway | brite | module | disease | drug | environ | # ko | genome | | compound | glycan | reaction | # rpair | rclass | enzyme | genomes | genes | ligand | kegg # = KEGG organism code or T number return _q("info", database) def kegg_list(database, org=None): """KEGG list - Entry list for database, or specified database entries. db - database or organism (string) org - optional organism (string), see below. For the pathway and module databases the optional organism can be used to restrict the results. """ # TODO - split into two functions (dbentries seems separate)? # # http://rest.kegg.jp/list// # # = pathway | module # = KEGG organism code if isinstance(database, str) and (database in ["pathway", "module"]) and org: resp = _q("list", database, org) elif isinstance(database, str) and database and org: raise Exception("Invalid database arg for kegg list request.") # http://rest.kegg.jp/list/ # # = pathway | brite | module | disease | drug | environ | # ko | genome | | compound | glycan | reaction | # rpair | rclass | enzyme | organism # = KEGG organism code or T number # # # http://rest.kegg.jp/list/ # # = KEGG database entries involving the following # = pathway | brite | module | disease | drug | environ | # ko | genome | | compound | glycan | reaction | # rpair | rclass | enzyme # = KEGG organism code or T number else: if isinstance(database, list) and len(database) <= 100: database = ("+").join(database) elif isinstance(database, list) and len(database) > 100: raise Exception("Maximuim number of databases is 100 for kegg list query") resp = _q("list", database) return resp def kegg_find(database, query, option=None): """KEGG find - Data search. Finds entries with matching query keywords or other query data in a given database. db - database or organism (string) query - search terms (string) option - search option (string), see below. For the compound and drug database, set option to the string 'formula', 'exact_mass' or 'mol_weight' to search on that field only. The chemical formula search is a partial match irrespective of the order of atoms given. The exact mass (or molecular weight) is checked by rounding off to the same decimal place as the query data. A range of values may also be specified with the minus(-) sign. """ # TODO - return list of tuples? # # http://rest.kegg.jp/find///