source: orange-bioinformatics/orangecontrib/bio/widgets/prototypes/OWExampleSelector.py @ 1873:0810c5708cc5

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

Moved '_bioinformatics' into orangecontrib namespace.

Line 
1"""
2<name>Example Selector</name>
3<description>Select examples based on input selectors.</description>
4<icon>icons/SelectGenes.png</icon>
5<priority>1070</priority>
6<contact>Peter Juvan (peter.juvan@fri.uni-lj.si)</contact>
7<prototype>1</prototype>
8"""
9
10from __future__ import absolute_import
11
12from qttable import *
13
14from Orange.OrangeWidgets import OWGUI
15from Orange.OrangeWidgets.OWWidget import *
16
17from .. import chipstat
18from .OWDataFiles import DataFiles, ExampleSelection
19
20class OWExampleSelector(OWWidget):
21    settingsList  = ['negate', 'commitOnChange', 'sendNotSelectedData']
22
23    def __init__(self, parent=None, signalManager = None):
24        OWWidget.__init__(self, parent, signalManager, 'Example Selector')
25        self.callbackDeposit = []
26
27        self.inputs = [("Example Selection", ExampleSelection, self.loadselection, Multiple + Default), ("Structured Data", DataFiles, self.chipdata)]
28        self.outputs = [("Example Selection", ExampleSelection), ("Selected Structured Data", DataFiles, Default), ("Other Structured Data", DataFiles)]
29
30        # Settings
31        self.negate = 0
32        self.commitOnChange = 1
33        self.sendNotSelectedData = 1
34        self.loadSettings()
35
36        self.selectors = {}
37        self.data = None
38
39        # GUI
40        # info
41        box = QVGroupBox("Info", self.controlArea)
42        self.infoa = QLabel('No data on input.', box)
43        self.infob = QLabel('', box)
44        OWGUI.separator(self.controlArea)
45        box.setMinimumWidth(170)
46
47        # gene selection
48        self.layout=QVBoxLayout(self.mainArea)
49        box = QVGroupBox("Gene Selection", self.mainArea)
50        self.table=QTable(box)
51        self.table.setSelectionMode(QTable.NoSelection)
52        self.layout.add(box)
53        self.table.hide()
54        self.drawtable()
55
56        OWGUI.checkBox(box, self, 'negate', 'Negate', callback = self.selectionChange)
57
58        # output
59        box = QVGroupBox("Output", self.controlArea)
60        OWGUI.checkBox(box, self, 'sendNotSelectedData', 'Send not selected data', callback=self.selectionChange)
61        OWGUI.checkBox(box, self, 'commitOnChange', 'Commit data on change')
62        self.commitBtn = OWGUI.button(box, self, "Commit", callback=self.senddata, disabled=1)
63
64        self.resize(700,100)
65       
66    def chipdata(self, data):
67        if data:
68            self.data = data
69            if self.commitOnChange and len(self.selectors)>0 and len(self.data[0][1][0]) == len(self.selectors.values()[0][1]):
70                self.senddata()
71        else:
72            self.send("Selected Structured Data", None)
73            self.send("Other Structured Data", None)
74            self.send("Example Selection", None)
75        self.commitBtn.setEnabled(data <> None)
76
77    def loadselection(self, selector, id):
78        if selector:
79            self.selectors[id] = list(selector + (1,0))    # the last two items for use and negation
80        else:
81            if id in self.selectors.keys(): del self.selectors[id]
82        self.infoa.setText('%d selectors on input.' % len(self.selectors))
83        self.drawtable()
84##        print "debug OWExampleSelector.loadselection: self.commitOnChange: %s, len(self.selectors)>0: %s, self.data: %s, self.selectors.values(): %s" % (str(self.commitOnChange), str(len(self.selectors)>0), str(self.data), str(self.selectors.values()))
85        if self.commitOnChange and len(self.selectors)>0 and self.data and len(self.data[0][1][0]) == len(self.selectors.values()[0][1]):
86            self.senddata()
87        self.commitBtn.setEnabled(self.selectors <> None and len(self.selectors))
88
89    def drawtable(self):
90        header = ['', 'Selector Name', 'Match #', 'Neg']
91        self.table.setNumCols(len(header))
92        self.header=self.table.horizontalHeader()
93        for i in range(len(header)):
94            self.header.setLabel(i, header[i])
95
96        self.table.setNumRows(len(self.selectors))
97        self.usesel_callback = [None] * len(self.selectors)
98        self.tmpWidgets = []
99        for (i, sel) in enumerate(self.selectors.values()):
100            for (pos, k) in [(0,2), (3,3)]:
101                cb = QCheckBox('', None)
102                cb.setChecked(sel[k])
103                self.usesel_callback[i] = lambda x, i=sel, k=k: self.usesel(x, i, k)
104                self.connect(cb, SIGNAL("toggled(bool)"), self.usesel_callback[i])
105                self.table.setCellWidget(i, pos, cb)
106                self.tmpWidgets.append(cb)
107           
108            self.table.setText(i, 1, sel[0])
109            self.table.setText(i, 2, '%d (%4.1f%s)' % (sel[1].count(1), 100.*sel[1].count(1)/len(sel[1]), '%') )
110        self.table.setLeftMargin(0)
111        self.table.verticalHeader().hide()
112
113        for i in range(len(header)):
114            self.table.adjustColumn(i)
115
116        self.table.show()
117
118    def usesel(self, x, sel, k):
119        sel[k] = int(x)
120        if self.commitOnChange:
121            self.senddata()
122
123    def senddata(self):
124        if len(self.selectors):
125            self.progressBarInit()
126            sel = []
127            for s in self.selectors.values():
128                if s[2]: # used?
129                    if s[3]: # negated?
130                        sel.append([not x for x in s[1]])
131                    else:
132                        sel.append(s[1])
133            if len(sel) == 0:
134                match = [0]*len(self.selectors.values()[0][1])
135            elif len(sel)>1:
136##                match = apply(map, (max, ) + tuple(sel))
137                match = apply(map, (min, ) + tuple(sel))
138            else:
139                match = sel[0]
140            if self.negate:
141                match = [not x for x in match]
142
143            nmatch = match.count(1)
144            self.infob.setText("%d genes (%4.1f%s) match criteria" % (nmatch, 100.*nmatch/len(self.selectors.values()[0][1]), '%'))
145
146            self.match = match
147##            self.progressBarSet(20)
148
149            self.send("Example Selection", self.match)
150            if self.data:
151                n = self.match.count(1)
152                if n==len(self.data[0][1][0]): # all genes match
153                    self.progressBarFinished()
154                    self.send("Selected Structured Data", self.data)
155                    self.send("Other Structured Data", None)
156                elif n==0:
157                    self.progressBarFinished()
158                    self.send("Selected Structured Data", None)
159                    if self.sendNotSelectedData:
160                        self.send("Other Structured Data", self.data)
161                    else:
162                        self.send("Other Structured Data", None)
163                else:
164                    try:
165                        P = []; N = []
166                        if self.sendNotSelectedData:
167                            pbStep = 50. / len(self.data)
168                        else:
169                            pbStep = 100. / len(self.data)
170                        for (strainname, data) in self.data:
171                            dataP = [d.select(self.match) for d in data]
172                            for i in range(len(data)):
173                                dataP[i].name = data[i].name
174                            P.append((strainname, dataP))
175                            self.progressBarAdvance(pbStep)
176                        self.send("Selected Structured Data", P)
177                        if self.sendNotSelectedData:
178                            for (strainname, data) in self.data:
179                                dataN = [d.select(self.match, negate=1) for d in data]
180                                for i in range(len(data)):
181                                    dataN[i].name = data[i].name
182                                N.append((strainname, dataN))
183                                self.progressBarAdvance(pbStep)
184                            self.send("Other Structured Data", N)
185                        else:
186                            self.send("Other Structured Data", None)
187                    except:
188                        print "debug OWExampleSelector.senddata\n\tlen(d): %i\n\tlen(self.match): %i\n\t" % (len(d), len(self.match))
189                        raise
190            self.progressBarFinished()
191
192    def selectionChange(self):
193        if self.commitOnChange:
194            self.senddata()
195
196
197if __name__=="__main__":
198    a=QApplication(sys.argv)
199    ow=OWExampleSelector()
200    a.setMainWidget(ow)
201    ow.show()
202    a.exec_loop()
203    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.