source: orange-bioinformatics/orangecontrib/bio/obiKEGG/brite.py @ 1873:0810c5708cc5

Revision 1873:0810c5708cc5, 2.4 KB checked in by Ales Erjavec <ales.erjavec@…>, 6 months ago (diff)

Moved '_bioinformatics' into orangecontrib namespace.

RevLine 
[1532]1"""
[1734]2KEGG Brite
[1532]3
4"""
5from __future__ import absolute_import
6
7import os
8import re
9import urllib2
10
[1601]11from Orange.utils import deprecated_attribute
[1532]12
13from . import conf
[1734]14
15
[1532]16class BriteEntry(object):
[1734]17    _search_re = {
18        "ids": re.compile('(?P<ids>\[.*:.*\])'),
19        "title": re.compile(r'(<[Bb]>)?(?P<title>\b[a-zA-Z0-9_/\s,;:.+=\-\[\]{}\(\)]+?)(?(1)</[Bb]>)$'),
20        "links": re.compile('(?P<links><a href=".+?">.*?</a>)')
21    }
22
[1532]23    def __init__(self, line):
24        self.entries = []
25        self.line = line[1:].strip()
26        for name, re in self._search_re.items():
27            search = re.search(self.line)
28            setattr(self, name, search.group(name) if search else None)
29
30    def __iter__(self):
31        return iter(self.entries)
32
33    entrys = deprecated_attribute("entrys", "entries")
34
[1734]35
[1532]36class Brite(BriteEntry):
37    VERSION = "v1.0"
38    BRITE_URL_FORMAT = "http://www.genome.jp/kegg-bin/download_htext?htext={brite_id}.keg&format=htext&filedir="
[1734]39
[1532]40    def __init__(self, brite_id, local_cache=None):
41        super(Brite, self).__init__("")
42        self.brite_id = id
43        if local_cache is None:
44            local_cache = conf.params["cache.path"]
45        self.local_cache = local_cache
[1734]46
[1532]47        self.load(brite_id)
[1734]48
[1532]49    def _get_brite(self, brite_id):
50        url = self.BRITE_URL_FORMAT.format(brite_id=brite_id)
51        local_filename = os.path.join(self.local_cache, brite_id + ".keg")
52        if not os.path.exists(local_filename):
53            brite = urllib2.urlopen(url).read()
54            with open(local_filename, "wb") as f:
55                f.write(brite)
[1734]56
[1532]57        return open(local_filename, "rb")
[1734]58
[1532]59    def load(self, brite_id):
60        lines = self._get_brite(brite_id).read().split("\n!\n")[1].splitlines()
[1734]61
[1532]62        # TODO: Implement a proper parser
[1734]63
[1532]64        def collect(lines, depth, collection):
65            while lines:
66                line = lines[0]
67                if line.startswith("#"):
68                    lines.pop(0)
69                elif line.startswith(depth) and len(line.strip()) > 1:
[1734]70                    collection.append(BriteEntry(lines.pop(0)))
[1532]71                elif line[0] > depth:
72                    collect(lines, line[0], collection[-1].entries)
73                elif line[0] < depth:
74                    return
75                else:
76                    lines.pop(0)
[1734]77
78        collect([line for line in lines
79                 if not line.startswith("#") and len(line) > 1], "A",
80                self.entries)
Note: See TracBrowser for help on using the repository browser.