source: orange-bioinformatics/_bioinformatics/obiDictyMutants.py @ 1778:a94aec22f398

Revision 1778:a94aec22f398, 4.7 KB checked in by Flashpoint <vid.flashpoint@…>, 12 months ago (diff)

Added pickling to obiDictyMutants.py, changed the URL in obiGeneSets.py's omimGeneSets()

Line 
1import os
2import urllib2
3import shutil
4import cPickle as pickle
5
6from collections import defaultdict
7
8from Orange.orng import orngServerFiles
9
10class DictyMutant(object):
11
12    def __init__(self, mutant_line):
13        mutant = mutant_line.split("\t")
14        self.name = mutant[0]
15        self.descriptor = set(mutant[1].split("/"))
16        self.genes = mutant[2].split(" | ")
17        self.phenotypes = mutant[3].split(" | ")
18        self.null = False
19        self.overexp = False
20        self.multiple = False
21        self.develop = False
22        self.other = False
23 
24class DictyMutants(object):
25    VERSION=1
26    DEFAULT_DATABASE_PATH = orngServerFiles.localpath("DictyMutants") #use a default folder for storing the genesets
27
28    def __init__(self, local_database_path=None):
29        self.local_database_path = local_database_path if local_database_path is not None else self.DEFAULT_DATABASE_PATH
30        self.local_pickle_path = os.path.join(self.local_database_path, "Mutants.pkl")
31
32        if not os.path.exists(self.local_database_path):
33            os.mkdir(self.local_database_path)
34           
35        if not os.path.exists(self.local_pickle_path):
36            self.prepare_mutants()
37        else:
38            self._mutants = pickle.load(open(self.local_pickle_path, "rb"))
39 
40    def update_file(self, name):
41        url = "http://dictybase.org/db/cgi-bin/dictyBase/download/download.pl?area=mutant_phenotypes&ID="
42        filename = os.path.join(self.local_database_path, name)
43        temp_file = os.path.join(self.local_database_path, name + "_temp")
44        stream = urllib2.urlopen(url + name)
45   
46        with open(temp_file, "wb") as file:
47            shutil.copyfileobj(stream, file)
48   
49        os.rename(temp_file, filename)
50        return filename
51   
52    def load_mutants(self, file):
53        data = open(file)
54        data_header = data.readline()
55        data = data.read()
56        return data.splitlines()
57       
58    def prepare_mutants(self):   
59        all_mutants = self.load_mutants(self.update_file("all-mutants.txt"))
60        null_mutants = self.load_mutants(self.update_file("null-mutants.txt"))
61        overexp_mutants = self.load_mutants(self.update_file("overexpression-mutants.txt"))
62        multiple_mutants = self.load_mutants(self.update_file("multiple-mutants.txt"))
63        develop_mutants = self.load_mutants(self.update_file("developmental-mutants.txt"))
64        other_mutants = self.load_mutants(self.update_file("other-mutants.txt"))
65   
66        _mutants = [DictyMutant(mutant) for mutant in all_mutants]
67       
68        the_nulls = set([DictyMutant(line).name for line in null_mutants])
69        the_overexps = set([DictyMutant(line).name for line in overexp_mutants])
70        the_multiples = set([DictyMutant(line).name for line in multiple_mutants])
71        the_develops = set([DictyMutant(line).name for line in develop_mutants])
72        the_others = set([DictyMutant(line).name for line in other_mutants])
73
74        for mutant in _mutants:
75            if mutant.name in the_nulls: mutant.null = True
76            if mutant.name in the_overexps: mutant.overexp = True 
77            if mutant.name in the_multiples: mutant.multiple = True
78            if mutant.name in the_develops: mutant.develop = True
79            if mutant.name in the_others: mutant.other = True
80       
81        self._mutants = {x: x for x in _mutants}
82        pickle.dump(self._mutants, open(self.local_pickle_path, "wb"), -1)
83
84    @classmethod
85    def get_instance(cls):
86        if not hasattr(cls, "_shared_dict"):
87            dicty = DictyMutants()
88            cls._shared_dict = dicty.__dict__
89        instance = DictyMutants.__new__(DictyMutants)
90        instance.__dict__ = cls._shared_dict
91        return instance
92
93    def mutants(self):
94        return self._mutants.keys()
95
96    def genes(self):
97        return sorted(set(reduce(list.__add__, [self.mutant_genes(mutant) for mutant in self.mutants()], [])))
98
99    def mutant_genes(self, mutant):
100        return self._mutants[mutant].genes
101
102    def gene_mutants(self):
103        d = defaultdict(set)
104        for mutant, genes in [(mutant, self.mutant_genes(mutant)) for mutant in self.mutants()]:
105            for gene in genes:
106                d[gene].add(mutant)
107        return d
108
109def mutants():
110    """ Return all mutant objects
111    """
112    return DictyMutants.get_instance().mutants()
113
114def genes():
115    """ Return a set of all genes referenced in dictybase
116    """
117    return DictyMutants.get_instance().genes()
118
119def mutant_genes(mutant):
120    """ Return a set of all genes referenced by a mutant in dictybase
121    """
122    return DictyMutants.get_instance().mutant_genes(mutant)
123
124def gene_mutants():
125    """ Return a dictionary {gene: set(mutant_objects for mutant), ...}
126    """
127    return DictyMutants.get_instance().gene_mutants()
128
129if  __name__  == "__main__":
130    print(mutants())   
Note: See TracBrowser for help on using the repository browser.