source: orange-bioinformatics/widgets/prototypes/OWExampleSelector.py @ 972:bfb2c971bb0e

Revision 972:bfb2c971bb0e, 8.1 KB checked in by markotoplak, 5 years ago (diff)

bioinformatics: moved some widgets, which cannot be imported, to prototypes

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