source: orange-bioinformatics/_bioinformatics/obiDictyMutants.py @ 1781:764dc2b10839

Revision 1781:764dc2b10839, 5.6 KB checked in by Flashpoint <vid.flashpoint@…>, 12 months ago (diff)

First attempt at configuring Orange server update

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