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

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

Moved '_bioinformatics' into orangecontrib namespace.

RevLine 
[1712]1def only_option(a):
2    if len(a) == 1:
3        return list(a)[0]
4    else:
5        raise Exception()
6
7class GenesetRegException(Exception): pass
8
9class GeneSet(object):
10
11    def __init__(self, genes=None, name=None, id=None, \
12        description=None, link=None, organism=None, hierarchy=None, pair=None):
13        """
14        pair can be (id, listofgenes) - it is used before anything else.
15        """
16        if genes == None:
17            genes = []
18
[1781]19        self.hierarchy = hierarchy     
[1712]20        self.genes = set(genes)
21        self.name = name
22        self.id = id
23        self.description = description
24        self.link = link
25        self.organism = organism
26
27        if pair:
28            self.id, self.genes = pair[0], set(pair[1])
29
30    """
31    the following functions are needed for sets of gene sets to be able
32    to assess equality
33    """
34
35    def __hash__(self):
36        return self.id.__hash__() + self.name.__hash__()
37
38    def __eq__(self, other):
39        if isinstance(other, self.__class__):
40            return self.__dict__ == other.__dict__
41        else:
42            return False
43
44    def __ne__(self, other):
45        return not self.__eq__(other)
46
47    def size(self):
48        return len(self.genes)
49
50    def cname(self, source=True, name=True):
51        """ Constructs a gene set name with the hierarchy. """
52        oname = self.id
53        if source and self.hierarchy:
54            oname = "[ " + ", ".join(self.hierarchy) + " ] " + oname
55        if name and self.name:
56            oname = oname + " " + self.name
57        return oname
58
59    def to_odict(self, source=True, name=True):
60        """
61        Returns a pair (id, listofgenes), like in old format.
62        """
63        return self.cname(source=source, name=name), self.genes
64
65    def __repr__(self):
66        return "GeneSet(" + ", ".join( [ 
67            "id=" + str(self.id),
68            "genes=" + str(self.genes),
69            "name=" + str(self.name),
70            "link=" + str(self.link),
71            "hierarchy=" + str(self.hierarchy)
72        ]) + ")"
73
74class GeneSetIDException(Exception):
75    pass
76
77class GeneSets(set):
78   
79    def __init__(self, input=None):
80        """
81        odict are genesets in old dict format.
82        gs are genesets in new format
83        """
84        if input != None and len(input) > 0:
85            self.update(input)
86
87    def update(self, input):
88        if isinstance(input, GeneSets):
89            super(GeneSets, self).update(input)
90        else:
91            prepared_genesets = [] #parse them all before adding,
92                                   #so that it fails on error
93            if hasattr(input, "items"):
94                for i, g in input.items():
95                    prepared_genesets.append(GeneSet(pair=(i, g)))
96            else:
97                for i in input:
98                    if isinstance(i, GeneSet):
99                        prepared_genesets.append(i)
100                    else:
101                        i, g = i
102                        prepared_genesets.append(GeneSet(pair=(i, g)))
103
104            for g in prepared_genesets:
105                self.add(g)
106
107    def to_odict(self):
108        """ Return gene sets in old dictionary format. """
109        return dict(gs.to_odict() for gs in self)
110
111    def set_hierarchy(self, hierarchy):
112        """ Sets hierarchy for all gene sets """
113        for gs in self:
114            gs.hierarchy = hierarchy
115
116    def __repr__(self):
117        return "GeneSets(" + set.__repr__(self) + ")"
118
119    def common_org(self):
120        """ Returns the common organism. """
121        if len(self) == 0:
122            raise GenesetRegException("Empty gene sets.")
123
124        organisms = set(a.organism for a in self)
125
126        try:
127            return only_option(organisms)
128        except:
129            raise GenesetRegException("multiple organisms: " + str(organisms))
130
131    def hierarchies(self):
132        """ Returns all hierachies """
133        if len(self) == 0:
134            raise GenesetRegException("Empty gene sets.")
135        return set(a.hierarchy for a in self)
136
137    def common_hierarchy(self):
138        hierarchies = self.hierarchies()
139
140        def common_hierarchy1(hierarchies):
141            def hier(l): return set(map(lambda x: x[:currentl], hierarchies))
142            currentl = max(map(len, hierarchies))
143            while len(hier(currentl)) > 1:
144                currentl -= 1
145            return only_option(hier(currentl))
146
147        return common_hierarchy1(hierarchies)
148
149    def split_by_hierarchy(self):
150        """ Splits gene sets by hierarchies. """
151        hd = dict((h,GeneSets()) for h in  self.hierarchies())
152        for gs in self:
153            hd[gs.hierarchy].add(gs)
154        return hd.values()
155
Note: See TracBrowser for help on using the repository browser.