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

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

Moved '_bioinformatics' into orangecontrib namespace.

Line 
1"""
2<name>Data Files Selector</name>
3<description>Selects a subset of data files.</description>
4<icon>icons/DataFilesSelector.png</icon>
5<priority>1060</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 Orange.OrangeWidgets import OWGUI
13from Orange.OrangeWidgets.OWWidget import *
14
15from .OWDataFiles import DataFiles, ExampleSelection
16
17class OWDataFilesSelector(OWWidget):
18    settingsList  = ["applyOnChange"]
19
20    def __init__(self, parent=None, signalManager = None):
21        OWWidget.__init__(self, parent, signalManager, 'Data Files Selector', wantMainArea = 0, resizingEnabled = 1)
22
23        self.callbackDeposit = []
24
25        self.inputs = [("Structured Data", DataFiles, self.onDataInput)]
26        self.outputs = [("Examples", ExampleTable), ("Structured Data", DataFiles)]
27
28        self.dataStructure = None
29        self.datasets = None
30        self.lastSentIds = []
31
32        # Settings
33        self.applyOnChange = 0
34        self.loadSettings()
35
36        # GUI
37        # info
38        box = OWGUI.widgetBox(self.controlArea, "Info", addSpace = True)
39        self.infoa = OWGUI.widgetLabel(box, 'No data loaded.')
40        self.infob = OWGUI.widgetLabel(box, '')
41        self.infoc = OWGUI.widgetLabel(box, '')
42           
43        # LIST VIEW
44        frmListView = OWGUI.widgetBox(self.controlArea, None, addSpace = True)
45        self.tree = QTreeWidget(frmListView)
46        self.tree.setSelectionMode(QAbstractItemView.MultiSelection)
47        self.tree.setHeaderLabel("Directory/Data File")
48        frmListView.layout().addWidget(self.tree)
49        self.connect(self.tree,SIGNAL('itemSelectionChanged()'),self.selectionChanged)
50
51        # Output
52        box = OWGUI.widgetBox(self.controlArea, "Output", addSpace = True)
53        OWGUI.checkBox(box, self, 'applyOnChange', 'Commit data on selection change')
54        self.commitBtn = OWGUI.button(box, self, "Commit", callback=self.sendData, disabled=1)
55        self.resize(300,600)
56
57    def setFileTree(self):
58        self.disconnect(self.tree,SIGNAL('itemSelectionChanged()'),self.selectionChanged)
59        self.tree.clear()
60        self.listitems = []
61        if self.dataStructure:
62            for d in self.dataStructure:
63                (dirname, files) = d
64                diritem = QTreeWidgetItem(self.tree, [dirname], QTreeWidgetItem.UserType)
65                diritem.setSelected(1)
66                self.listitems.append(diritem)
67                diritem.setExpanded(1)
68                diritem.name = dirname
69                for f in files:
70                    item = QTreeWidgetItem(diritem, [f.name], QTreeWidgetItem.UserType)
71                    item.setSelected(1)
72                    self.listitems.append(item)
73                    item.data = f
74        self.connect(self.tree,SIGNAL('itemSelectionChanged()'),self.selectionChanged)
75
76    def selectionChanged(self):
77        if self.applyOnChange and self.okToCommit:
78            self.sendData()
79
80    # checks which data has been selected, builds a data structure, and sends it out
81    def sendData(self):
82        data = []
83        # clear what has been previously sent
84        for id in self.lastSentIds:
85            self.send("Examples", None, id)
86        self.lastSentIds = []
87        # send new data
88        id = 0
89        for tIdx in range(self.tree.topLevelItemCount()):
90            dir = self.tree.topLevelItem(tIdx)
91            if dir in self.tree.selectedItems():
92                files = []
93                for cIdx in range(dir.childCount()):
94                    f = dir.child(cIdx)
95                    if f in self.tree.selectedItems():
96                        files.append(f.data)
97                        self.send("Examples", f.data, id)
98                        self.lastSentIds.append(id)
99                        id += 1
100                data.append((dir.name, files))
101        self.send("Structured Data", data)
102
103    def onDataInput(self, dataStructure):
104        self.dataStructure = dataStructure
105        self.datasets = []
106        if dataStructure and len(dataStructure):
107            for name, etList in dataStructure:
108                for et in etList:
109                    self.datasets.append(et)
110            # sumarize the data
111            numSets = len(self.dataStructure)
112            numFiles = len(self.datasets)
113            self.infoa.setText("%d set%s, total of %d data file%s." % (numSets, ["", "s"][numSets!=1], numFiles, ["","s"][numFiles!=1]))
114            # construct lists that sumarize the data
115            numExamplesList = []
116            numAttrList = []
117            hasClass = []
118            attrNameList = []
119            for et in self.datasets:
120                numExamplesList.append(len(et))
121                numAttrList.append(len(et.domain.attributes))
122                hasClass.append(et.domain.classVar != None)
123                for attr in et.domain.attributes:
124                    if attr.name not in attrNameList:
125                        attrNameList.append(attr.name)
126            # report the number of attributes/class
127            if len(numAttrList):
128                minNumAttr = min(numAttrList)
129                maxNumAttr = max(numAttrList)
130                if minNumAttr != maxNumAttr:
131                    infob = "From %d to %d attribute%s (%d in total)" % (minNumAttr, maxNumAttr, ["","s"][maxNumAttr!=1], len(attrNameList))
132                else:
133                    infob = "%d attribute%s" % (maxNumAttr, ["","s"][maxNumAttr!=1])
134            else:
135                infob = "No attributes"
136            if sum(hasClass) == len(hasClass):
137                infob += ", all files contain class variable."
138            elif sum(hasClass) == 0:
139                infob += ", no class variable."
140            else:
141                infob += ", some files contain class variable."
142            self.infob.setText(infob)
143            # report the number of examples
144            if len(numExamplesList):
145                infoc = "Files contain "
146                minNumE = min(numExamplesList)
147                maxNumE = max(numExamplesList)
148                if minNumE == maxNumE:
149                    infoc += "%d example%s, " % (maxNumE, ["","s"][maxNumE!=1])
150                else:
151                    infoc += "from %d to %d example%s, " % (minNumE, maxNumE, ["","s"][maxNumE!=1])
152                infoc += "%d in total." % sum(numExamplesList)
153            else:
154                infoc = "Files contain no examples."
155            self.infoc.setText(infoc)
156
157            # read data
158            self.okToCommit = 1
159            self.commitBtn.setEnabled(1)
160        else:
161            self.infoa.setText('No data on input.')
162            self.infob.setText('')
163            self.infoc.setText('')
164            self.okToCommit = 0
165            self.commitBtn.setEnabled(0)
166        # enable/disable commit
167        # read data
168        self.setFileTree()
169        if self.applyOnChange:
170            self.sendData()
171
172
173if __name__=="__main__":
174    a=QApplication(sys.argv)
175    ow=OWDataFilesSelector()
176    ow.show()
177    a.exec_()
178    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.