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

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

Fixing imports.

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