source: orange-bioinformatics/Orange/bioinformatics/widgets/prototypes/OWExampleSelector.py @ 1633:b8852fdd1a0f

Revision 1633:b8852fdd1a0f, 8.2 KB checked in by mitar, 2 years ago (diff)

Fixing imports.

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