source: orange-bioinformatics/orangecontrib/bio/geneset.py @ 1933:bf2cdd778fee

Revision 1933:bf2cdd778fee, 5.2 KB checked in by markotoplak, 4 months ago (diff)

Converted documentation of obiGeneSets to rst.

Line 
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    """ A single set of genes.
11    """
12
13    def __init__(self, genes=[], name=None, id=None, \
14        description=None, link=None, organism=None, hierarchy=None, pair=None):
15        """
16        :param pair: Backward compatibility: convert a tuple (name, genes)
17            into this object.
18        """
19
20        self.hierarchy = hierarchy     
21        """ Hierarchy should be formated as a tuple, for example ``("GO", "biological_process")``"""
22
23        self.genes = set(genes)
24        """ A set of genes. Genes are strings. """
25
26        self.name = name
27        """ Gene set name. """
28
29        self.id = id
30        """ Short gene set ID. """
31
32        self.description = description
33        """ Gene set description. """
34
35        self.link = link
36        """ Link to further information about this gene set. """
37
38        self.organism = organism
39        """ Organism as a NCBI taxonomy ID. """
40
41        if pair:
42            self.id, self.genes = pair[0], set(pair[1])
43
44    """
45    the following functions are needed for sets of gene sets to be able
46    to assess equality
47    """
48
49    def __hash__(self):
50        return self.id.__hash__() + self.name.__hash__()
51
52    def __eq__(self, other):
53        if isinstance(other, self.__class__):
54            return self.__dict__ == other.__dict__
55        else:
56            return False
57
58    def __ne__(self, other):
59        return not self.__eq__(other)
60
61    def size(self):
62        return len(self.genes)
63
64    def cname(self, source=True, name=True):
65        """ Return a gene set name with hieararchy. """
66        oname = self.id
67        if source and self.hierarchy:
68            oname = "[ " + ", ".join(self.hierarchy) + " ] " + oname
69        if name and self.name:
70            oname = oname + " " + self.name
71        return oname
72
73    def to_odict(self, source=True, name=True):
74        """
75        Backward compatibility: returns a gene set as a tuple
76        (id, list of genes).
77        """
78        return self.cname(source=source, name=name), self.genes
79
80    def __repr__(self):
81        return "GeneSet(" + ", ".join( [ 
82            "id=" + str(self.id),
83            "genes=" + str(self.genes),
84            "name=" + str(self.name),
85            "link=" + str(self.link),
86            "hierarchy=" + str(self.hierarchy)
87        ]) + ")"
88
89class GeneSetIDException(Exception):
90    pass
91
92class GeneSets(set):
93    """ A collection of gene sets: contains :class:`GeneSet` objects.
94    It is a subclass of Python's :obj:`set`.
95    """
96   
97    def __init__(self, input=None):
98        """
99        If input is a dictionary, the gene sets are converted to the current format.
100        """
101        if input != None and len(input) > 0:
102            self.update(input)
103
104    def update(self, input):
105        if isinstance(input, GeneSets):
106            super(GeneSets, self).update(input)
107        else:
108            prepared_genesets = [] #parse them all before adding,
109                                   #so that it fails on error
110            if hasattr(input, "items"):
111                for i, g in input.items():
112                    prepared_genesets.append(GeneSet(pair=(i, g)))
113            else:
114                for i in input:
115                    if isinstance(i, GeneSet):
116                        prepared_genesets.append(i)
117                    else:
118                        i, g = i
119                        prepared_genesets.append(GeneSet(pair=(i, g)))
120
121            for g in prepared_genesets:
122                self.add(g)
123
124    def to_odict(self):
125        """ Return gene sets in old dictionary format. """
126        return dict(gs.to_odict() for gs in self)
127
128    def set_hierarchy(self, hierarchy):
129        """ Sets hierarchy for all gene sets. """
130        for gs in self:
131            gs.hierarchy = hierarchy
132
133    def __repr__(self):
134        return "GeneSets(" + set.__repr__(self) + ")"
135
136    def common_org(self):
137        """ Return a common organism. """
138        if len(self) == 0:
139            raise GenesetRegException("Empty gene sets.")
140
141        organisms = set(a.organism for a in self)
142
143        try:
144            return only_option(organisms)
145        except:
146            raise GenesetRegException("multiple organisms: " + str(organisms))
147
148    def hierarchies(self):
149        """ Return all hierarchies. """
150        if len(self) == 0:
151            raise GenesetRegException("Empty gene sets.")
152        return set(a.hierarchy for a in self)
153
154    def common_hierarchy(self):
155        """ Return a common hierarchy. """
156        hierarchies = self.hierarchies()
157
158        def common_hierarchy1(hierarchies):
159            def hier(l): return set(map(lambda x: x[:currentl], hierarchies))
160            currentl = max(map(len, hierarchies))
161            while len(hier(currentl)) > 1:
162                currentl -= 1
163            return only_option(hier(currentl))
164
165        return common_hierarchy1(hierarchies)
166
167    def split_by_hierarchy(self):
168        """ Split gene sets by hierarchies. Return a list of :class:`GeneSets` objects. """
169        hd = dict((h,GeneSets()) for h in  self.hierarchies())
170        for gs in self:
171            hd[gs.hierarchy].add(gs)
172        return hd.values()
173
Note: See TracBrowser for help on using the repository browser.