Changeset 1609:6b0bb985598f in orange-bioinformatics


Ignore:
Timestamp:
03/22/12 15:40:19 (2 years ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
rebase_source:
ea9fdc254b6cd844265917d81ac1575e88548e30
Message:

Can now specify specific annotation and ontology revision.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • obiGO.py

    r1422 r1609  
    66from gzip import GzipFile 
    77import tarfile 
     8import gzip 
    89import shutil 
    910import sys, os 
     
    2021except Exception: 
    2122    default_database_path = os.curdir 
     23 
     24_CVS_REVISION_RE = re.compile(r"^(rev)?\d+\.\d+$") 
    2225 
    2326evidenceTypes = { 
     
    250253    """ 
    251254    version = 1 
    252     def __init__(self, file=None, progressCallback=None): 
     255    def __init__(self, file=None, progressCallback=None, rev=None): 
    253256        """ Initialize the ontology from file (if `None` the default gene 
    254257        ontology will be loaded). The optional `progressCallback` will be 
     
    260263        self.instances = {} 
    261264        self.slimsSubset = set() 
    262         if file and os.path.exists(file): 
     265        if isinstance(file, basestring): 
    263266            self.ParseFile(file, progressCallback) 
     267             
     268        elif rev is not None: 
     269            if not _CVS_REVISION_RE.match(rev): 
     270                raise ValueError("Invalid revision format.") 
     271            if rev.startswith("rev"): 
     272                rev = rev[3:] 
     273            pc = lambda v: progressCallback(v/2.0) \ 
     274                 if progressCallback else None 
     275            filename = os.path.join(default_database_path, "gene_ontology_edit@rev%s.obo" % rev) 
     276            if not os.path.exists(filename): 
     277                self.DownloadOntologyAtRev(rev, filename, pc) 
     278            self.ParseFile(filename, lambda v: progressCallback(v/2.0 + 50) \ 
     279                                     if progressCallback else None) 
    264280        else: 
    265281            fool = self.Load(progressCallback) 
     
    416432    @staticmethod 
    417433    def DownloadOntology(file, progressCallback=None): 
    418         tFile = tarfile.open(file, "w:gz") if type(file) == str else file 
     434        tFile = tarfile.open(file, "w:gz") if isinstance(file, basestring) else file 
    419435        tmpDir = os.path.join(orngEnviron.bufferDir, "tmp_go/") 
    420436        try: 
     
    430446        os.remove(os.path.join(tmpDir, "gene_ontology_edit.obo")) 
    431447 
     448    @staticmethod 
     449    def DownloadOntologyAtRev(rev, filename=None, progressCallback=None): 
     450        import shutil 
     451        import urllib2 
     452        url = "http://cvsweb.geneontology.org/cgi-bin/cvsweb.cgi/~checkout~/go/ontology/gene_ontology_edit.obo?rev=%s" % rev 
     453        url += ";content-type=text%2Fplain" 
     454        if filename is None: 
     455            filename = os.path.join(default_database_path, "gene_ontology_edit@rev%s.obo" % rev) 
     456        r = urllib2.urlopen(url) 
     457        shutil.copyfileobj(r, open(filename, "wb")) 
     458         
     459         
    432460_re_obj_name_ = re.compile("([a-zA-z0-9-_]+)") 
    433461 
     
    474502    """ 
    475503    version = 2 
    476     def __init__(self, file=None, ontology=None, genematcher=None, progressCallback=None): 
     504    def __init__(self, file=None, ontology=None, genematcher=None, progressCallback=None, rev=None): 
    477505        """Initialize the annotations from file by calling ParseFile on it. 
    478506        The ontology must be an instance of Ontology class. 
     
    499527            if type(file, Annotations): 
    500528                taxid = file.taxid 
    501         elif file and os.path.exists(file): 
     529        elif isinstance(file, basestring) and os.path.exists(file): 
    502530            self.ParseFile(file, progressCallback) 
    503531            try: 
     
    505533            except IOError: 
    506534                pass 
    507         elif file: 
    508             a = self.Load(file, ontology, genematcher, progressCallback) 
    509             self.__dict__ = a.__dict__ 
    510             self.taxid = to_taxid(organism_name_search(file)).pop() 
     535        elif file is not None: 
     536            # Organism code 
     537            if rev is not None: 
     538                if not _CVS_REVISION_RE.match(rev): 
     539                    raise ValueError("Invalid revision format") 
     540                 
     541                if rev.startswith("rev"): 
     542                    rev = rev[3:] 
     543                code = self.organism_name_search(file) 
     544                filename = os.path.join(default_database_path, 
     545                                        "gene_association.%s@rev%s.tar.gz" % (code, rev)) 
     546                 
     547                if not os.path.exists(filename): 
     548                    self.DownloadAnnotationsAtRev(code, rev, filename, 
     549                                                  progressCallback 
     550                                                  ) 
     551                     
     552                self.ParseFile(filename, progressCallback) 
     553                self.taxid = to_taxid(code).pop() 
     554            else: 
     555                a = self.Load(file, ontology, genematcher, progressCallback) 
     556                self.__dict__ = a.__dict__ 
     557                self.taxid = to_taxid(organism_name_search(file)).pop() 
    511558        if not self.genematcher and self.taxid: 
    512559            import obiGene 
     
    586633            if os.path.isfile(file) and tarfile.is_tarfile(file): 
    587634                f = tarfile.open(file).extractfile("gene_association") 
     635            elif os.path.isfile(file) and file.endswith(".gz"): 
     636                f = gzip.open(file)  
    588637            elif os.path.isfile(file): 
    589638                f = open(file) 
     
    911960        os.remove(os.path.join(tmpDir, "gene_association." + org)) 
    912961        os.remove(os.path.join(tmpDir, "gene_names.pickle")) 
     962         
     963    @staticmethod 
     964    def DownloadAnnotationsAtRev(org, rev, filename=None, progressCallback=None): 
     965        import urllib2 
     966        import shutil 
     967        if filename is None: 
     968            filename = os.path.join(default_database_path, 
     969                                    "gene_association.%s@rev%s.tar.gz" % (code, rev)) 
     970        url = "http://cvsweb.geneontology.org/cgi-bin/cvsweb.cgi/~checkout~/go/gene-associations/gene_association.%s.gz?rev=%s" % (org, rev) 
     971        url += ";content-type=application%2Fx-gzip" 
     972        r = urllib2.urlopen(url) 
     973        shutil.copyfileobj(r, open(filename, "wb")) 
    913974 
    914975from obiTaxonomy import pickled_cache 
Note: See TracChangeset for help on using the changeset viewer.