source: orange-bioinformatics/Orange/bioinformatics/widgets/OWPIPA.py @ 1625:cefeb35cbfc9

Revision 1625:cefeb35cbfc9, 28.3 KB checked in by mitar, 2 years ago (diff)

Moving files around.

Line 
1"""
2<name>PIPA</name>
3<description>Access data from PIPA RNA-Seq database.</description>
4<icon>icons/PIPA.png</icon>
5<priority>30</priority>
6"""
7
8from OWWidget import *
9import obiDicty
10import OWGUI
11import orngEnviron
12import sys, os
13from collections import defaultdict
14import math
15
16
17#def pyqtConfigure(object, **kwargs):
18#    if hasattr(object, "pyqtConfigure"):
19#        object.pyqtConfigure(**kwargs)
20#    else:
21#        for name, value in kwargs.items():
22#            if object.metaObject().indexOfProperty(name) != -1:
23#                object.setProperty(name, value)
24#            elif object.metaObject().indexOfSignal(name) != -1:
25#                object.connect(object.
26
27def tfloat(s):
28    try:
29        return float(s)
30    except:
31        return None
32
33class MyTreeWidgetItem(QTreeWidgetItem):
34
35    def __init__(self, parent, *args):
36        QTreeWidgetItem.__init__(self, parent, *args)
37        self.par = parent
38
39    def __contains__(self, text):
40        return any(text.upper() in str(self.text(i)).upper() for i in range(self.columnCount()))   
41 
42    def __lt__(self, o1):
43        col = self.par.sortColumn()
44        if col in [8,9,10]: #WARNING: hardcoded column numbers
45            return tfloat(self.text(col)) < tfloat(o1.text(col))
46        else:
47            return QTreeWidgetItem.__lt__(self, o1)
48
49
50#set buffer file
51bufferpath = os.path.join(orngEnviron.directoryNames["bufferDir"], "pipa")
52try:
53    os.makedirs(bufferpath)
54except:
55    pass
56bufferfile = os.path.join(bufferpath, "database.sq3")
57
58class ListItemDelegate(QStyledItemDelegate):
59    def sizeHint(self, option, index):
60        size = QStyledItemDelegate.sizeHint(self, option, index)
61        size = QSize(size.width(), size.height() + 4)
62        return size
63
64    def createEditor(self, parent, option, index):
65        return QLineEdit(parent)
66   
67    def setEditorData(self, editor, index):
68        editor.setText(index.data(Qt.DisplayRole).toString())
69       
70    def setModelData(self, editor, model, index):
71#        print index
72        model.setData(index, QVariant(editor.text()), Qt.EditRole)
73
74class SelectionSetsWidget(QFrame):
75    """ Widget for managing multiple stored item selections
76    """
77    def __init__(self, parent):
78        QFrame.__init__(self, parent)
79        self.setContentsMargins(0, 0, 0, 0)
80        layout = QVBoxLayout()
81        layout.setContentsMargins(0, 0, 0, 0)
82        layout.setSpacing(1)
83#        self._titleLabel = QLabel(self)
84#        self._titleLabel
85#        layout.addWidget(self._titleLabel)
86        self._setNameLineEdit = QLineEdit(self)
87        layout.addWidget(self._setNameLineEdit)
88       
89        self._setListView = QListView(self)
90        self._listModel = QStandardItemModel(self)
91        self._proxyModel = QSortFilterProxyModel(self)
92        self._proxyModel.setSourceModel(self._listModel)
93       
94        self._setListView.setModel(self._proxyModel)
95        self._setListView.setItemDelegate(ListItemDelegate(self))
96       
97        self.connect(self._setNameLineEdit, SIGNAL("textChanged(QString)"), self._proxyModel.setFilterFixedString)
98       
99        self._completer = QCompleter(self._listModel, self)
100       
101        self._setNameLineEdit.setCompleter(self._completer)
102       
103        self.connect(self._listModel, SIGNAL("itemChanged(QStandardItem *)"), self._onSetNameChange)
104        layout.addWidget(self._setListView)
105        buttonLayout = QHBoxLayout()
106       
107        self._addAction = QAction("+", self)
108        self._updateAction = QAction("Update", self)
109        self._removeAction = QAction("-", self)
110       
111        self._addToolButton = QToolButton(self)
112        self._updateToolButton = QToolButton(self)
113        self._removeToolButton = QToolButton(self)
114        self._updateToolButton.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Minimum)
115       
116        self._addToolButton.setDefaultAction(self._addAction)
117        self._updateToolButton.setDefaultAction(self._updateAction)
118        self._removeToolButton.setDefaultAction(self._removeAction)
119         
120        buttonLayout.addWidget(self._addToolButton)
121        buttonLayout.addWidget(self._updateToolButton)
122        buttonLayout.addWidget(self._removeToolButton)
123       
124        layout.addLayout(buttonLayout)
125        self.setLayout(layout)
126       
127        self.connect(self._addAction, SIGNAL("triggered()"), self.addCurrentSelection)
128        self.connect(self._updateAction, SIGNAL("triggered()"), self.updateSelectedSelection)
129        self.connect(self._removeAction, SIGNAL("triggered()"), self.removeSelectedSelection)
130       
131        self.connect(self._setListView.selectionModel(), SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self._onListViewSelectionChanged)
132        self.selectionModel = None
133        self._selections = []
134       
135    def sizeHint(self):
136        size = QFrame.sizeHint(self)
137        return QSize(size.width(), 200)
138       
139    def _onSelectionChanged(self, selected, deselected):
140        self.setSelectionModified(True)
141       
142    def _onListViewSelectionChanged(self, selected, deselected):
143        try:
144            index= self._setListView.selectedIndexes()[0]
145        except IndexError:
146            return 
147        self.commitSelection(self._proxyModel.mapToSource(index).row())
148
149    def _onSetNameChange(self, item):
150        self.selections[item.row()].name = str(item.text())
151               
152    def _setButtonStates(self, val):
153        self._updateToolButton.setEnabled(val)
154       
155    def setSelectionModel(self, selectionModel):
156        if self.selectionModel:
157            self.disconnect(self.selectionModel, SIGNAL("selectionChanged(QItemSelection, QItemSelection)", self._onSelectionChanged))
158        self.selectionModel = selectionModel
159        self.connect(self.selectionModel, SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self._onSelectionChanged)
160       
161    def addCurrentSelection(self):
162        item = self.addSelection(SelectionByKey(self.selectionModel.selection(), name="New selection", key=(1, 2, 3 ,10)))
163        index = self._proxyModel.mapFromSource(item.index())
164        self._setListView.setCurrentIndex(index)
165        self._setListView.edit(index)
166        self.setSelectionModified(False)
167   
168    def removeSelectedSelection(self):
169        i = self._proxyModel.mapToSource(self._setListView.currentIndex()).row()
170        self._listModel.takeRow(i)
171        del self.selections[i]
172   
173    def updateCurentSelection(self):
174        i = self._proxyModel.mapToSource(self._setListView.selectedIndex()).row()
175        self.selections[i].setSelection(self.selectionModel.selection())
176        self.setSelectionModified(False)
177       
178    def addSelection(self, selection, name=""):
179        self._selections.append(selection)
180        item = QStandardItem(selection.name)
181        item.setFlags(item.flags() ^ Qt.ItemIsDropEnabled)
182        self._listModel.appendRow(item)
183        self.setSelectionModified(False)
184        return item
185       
186    def updateSelectedSelection(self):
187        i = self._proxyModel.mapToSource(self._setListView.currentIndex()).row()
188        self.selections[i].setSelection(self.selectionModel.selection())
189        self.setSelectionModified(False)
190       
191    def setSelectionModified(self, val):
192        self._selectionModified = val
193        self._setButtonStates(val)
194        self.emit(SIGNAL("selectionModified(bool)"), bool(val))
195       
196    def commitSelection(self, index):
197        selection = self.selections[index]
198        selection.select(self.selectionModel)
199       
200    def setSelections(self, selections):
201        self._listModel.clear()
202#        print selections
203        for selection in selections:
204            self.addSelection(selection)
205           
206    def selections(self):
207        return self._selections
208   
209    selections = property(selections, setSelections)
210   
211class SelectionByKey(object):
212    """ An object stores item selection by unique key values
213    (works only for row selections in list and table models)
214    Example::
215        ## Save selection by unique tuple pairs (DisplayRole of column 1 and 2)
216        selection = SelectionsByKey(itemView.selectionModel().selection(), key = (1,2))
217        ...
218        ## restore selection (Possibly omitting rows not present in the model) 
219        selection.select(itemView.selectionModel())
220    """
221   
222    def __init__(self, itemSelection, name="", key=(0,)):
223        self._key = key
224        self.name = name
225        self._selected_keys = []
226        if itemSelection:
227            self.setSelection(itemSelection)
228       
229    def _row_key(self, model, row):
230        val = lambda row, col: str(model.data(model.index(row, col), Qt.DisplayRole).toString())
231        return tuple(val(row, col) for col in self._key)
232   
233    def setSelection(self, itemSelection):
234        self._selected_keys = [self._row_key(ind.model(), ind.row()) for ind in itemSelection.indexes() if ind.column() == 0]
235   
236    def select(self, selectionModel):
237        model = selectionModel.model()
238        selected = []
239        selectionModel.clear()
240        for i in range(model.rowCount()):
241            if self._row_key(model, i) in self._selected_keys:
242                selectionModel.select(model.index(i, 0), QItemSelectionModel.Select | QItemSelectionModel.Rows)
243
244    def __len__(self):
245        return len(self._selected_keys)
246               
247class SortedListWidget(QWidget):
248    class _MyItemDelegate(QStyledItemDelegate):
249        def __init__(self, sortingModel, parent):
250            QStyledItemDelegate.__init__(self, parent)
251            self.sortingModel = sortingModel
252           
253        def sizeHint(self, option, index):
254            size = QStyledItemDelegate.sizeHint(self, option, index)
255            return QSize(size.width(), size.height() + 4)
256           
257        def createEditor(self, parent, option, index):
258            cb = QComboBox(parent)
259            cb.setModel(self.sortingModel)
260            cb.showPopup()
261            return cb
262       
263        def setEditorData(self, editor, index):
264            pass # TODO: sensible default
265       
266        def setModelData(self, editor, model, index):
267            text = editor.currentText()
268            model.setData(index, QVariant(text))
269   
270    def __init__(self, *args):
271        QWidget.__init__(self, *args)
272        self.setContentsMargins(0, 0, 0, 0)
273        gridLayout = QGridLayout()
274        gridLayout.setContentsMargins(0, 0, 0, 0)
275        gridLayout.setSpacing(1)
276        self._listView = QListView(self)
277        self._listView.setModel(QStandardItemModel(self))
278#        self._listView.setDragEnabled(True)
279        self._listView.setDropIndicatorShown(True)
280        self._listView.viewport().setAcceptDrops(True)
281        self._listView.setDragDropMode(QAbstractItemView.InternalMove)
282        self._listView.setMinimumHeight(100)
283       
284        gridLayout.addWidget(self._listView, 0, 0, 2, 2)
285       
286        vButtonLayout = QVBoxLayout()
287       
288        self._upAction = QAction(QIcon(os.path.join(orngEnviron.widgetDir, "icons/Dlg_up3.png")), "Up", self)
289       
290        self._upButton = QToolButton(self)
291        self._upButton.setDefaultAction(self._upAction)
292        self._upButton.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.MinimumExpanding)
293
294        self._downAction = QAction(QIcon(os.path.join(orngEnviron.widgetDir, "icons/Dlg_down3.png")), "Down", self)
295        self._downButton = QToolButton(self)
296        self._downButton.setDefaultAction(self._downAction)
297        self._downButton.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.MinimumExpanding)
298       
299        vButtonLayout.addWidget(self._upButton)
300        vButtonLayout.addWidget(self._downButton)
301       
302        gridLayout.addLayout(vButtonLayout, 0, 2, 2, 1)
303       
304        hButtonLayout = QHBoxLayout()
305       
306        self._addAction = QAction("+", self)
307        self._addButton = QToolButton(self)
308        self._addButton.setDefaultAction(self._addAction)
309       
310        self._removeAction = QAction("-", self)
311        self._removeButton = QToolButton(self)
312        self._removeButton.setDefaultAction(self._removeAction)
313        hButtonLayout.addWidget(self._addButton)
314        hButtonLayout.addWidget(self._removeButton)
315        hButtonLayout.addStretch(10)
316        gridLayout.addLayout(hButtonLayout, 2, 0, 1, 2)
317       
318        self.setLayout(gridLayout)
319       
320        self.connect(self._addAction, SIGNAL("triggered()"), self._onAddAction)
321        self.connect(self._removeAction, SIGNAL("triggered()"), self._onRemoveAction)
322        self.connect(self._upAction, SIGNAL("triggered()"), self._onUpAction)
323        self.connect(self._downAction, SIGNAL("triggered()"), self._onDownAction)
324       
325    def sizeHint(self):
326        size = QWidget.sizeHint(self)
327        return QSize(size.width(), 100)
328       
329    def _onAddAction(self):
330        item = QStandardItem("")
331        item.setFlags(item.flags() ^ Qt.ItemIsDropEnabled)
332        self._listView.model().appendRow(item)
333        self._listView.setCurrentIndex(item.index())
334        self._listView.edit(item.index()) 
335   
336    def _onRemoveAction(self):
337        current = self._listView.currentIndex()
338        self._listView.model().takeRow(current.row())
339   
340    def _onUpAction(self):
341        row = self._listView.currentIndex().row()
342        model = self._listView.model()
343        if row > 0:
344            items = model.takeRow(row)
345            model.insertRow(row - 1, items)
346            self._listView.setCurrentIndex(model.index(row - 1, 0))
347   
348    def _onDownAction(self):
349        row = self._listView.currentIndex().row()
350        model = self._listView.model()
351        if row < model.rowCount() and row >= 0:
352            items = model.takeRow(row)
353            if row == model.rowCount():
354                model.appendRow(items)
355            else:
356                model.insertRow(row + 1, items)
357            self._listView.setCurrentIndex(model.index(row + 1, 0))
358   
359    def setModel(self, model):
360        """ Set a model to select items from
361        """
362        self._model  = model
363        self._listView.setItemDelegate(self._MyItemDelegate(self._model, self))
364       
365    def addItem(self, *args):
366        """ Add a new entry in the list
367        """
368        item = QStandardItem(*args)
369        item.setFlags(item.flags() ^ Qt.ItemIsDropEnabled)
370        self._listView.model().appendRow(item)
371       
372    def setItems(self, items):
373        self._listView.model().clear()
374        for item in items:
375            self.addItem(item)
376         
377    def items(self):
378        order = []
379        for row in range(self._listView.model().rowCount()):
380             order.append(str(self._listView.model().item(row ,0).text()))
381        return order
382   
383    sortingOrder = property(items, setItems)
384       
385   
386class OWPIPA(OWWidget):
387    settingsList = [ "platform", "selectedExperiments", "server", "buffertime", "excludeconstant", "username", "password","joinreplicates",
388                     "selectionSetsWidget.selections", "columnsSortingWidget.sortingOrder", "currentSelection", "log2", "raw", "experimentsHeaderState", "ctypei"]
389    def __init__(self, parent=None, signalManager=None, name="PIPA"):
390        OWWidget.__init__(self, parent, signalManager, name)
391        self.outputs = [("Example table", ExampleTable)]
392
393        self.platform = None
394        self.username = ""
395        self.password = ""
396        self.log2 = False
397        self.ctypei = 0
398
399        self.selectedExperiments = []
400        self.buffer = obiDicty.BufferSQLite(bufferfile)
401
402        self.searchString = ""
403        self.excludeconstant = False
404        self.joinreplicates = False
405        self.currentSelection = None
406       
407        self.experimentsHeaderState = {"": False, "Name":False, "Species": False, "Strain": False, "Experiment":False, "Genotype": False, "Treatment": False,
408                                       "Growth": False, "Timepoint": False, "Replicate": False, "ID": False}
409
410        self.exTypes  = []
411        self.annots = {}
412
413        self.controlArea.setMaximumWidth(250)
414        self.controlArea.setMinimumWidth(250)
415
416        OWGUI.button(self.controlArea, self, "Reload", callback=self.Reload)
417        OWGUI.button(self.controlArea, self, "Clear cache", callback=self.clear_cache)
418       
419        b = OWGUI.widgetBox(self.controlArea, "Experiment Sets")
420        self.selectionSetsWidget = SelectionSetsWidget(self)
421        self.selectionSetsWidget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
422#        self.controlArea.layout().addWidget(self.selectionSetsWidget)
423        b.layout().addWidget(self.selectionSetsWidget)
424       
425        b = OWGUI.widgetBox(self.controlArea, "Sort output columns")
426        self.columnsSortingWidget = SortedListWidget(self)
427        self.columnsSortingWidget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
428#        self.controlArea.layout().addWidget(self.columnsSortingWidget)
429        b.layout().addWidget(self.columnsSortingWidget)
430        self.columnsSortingWidget.setModel(QStringListModel(["Strain", "Experiment", "Genotype", "Timepoint", "Growth", "Species", "Id", "Name"]))
431        self.columnsSortingWidget.sortingOrder = ["Strain", "Experiment", "Genotype", "Timepoint"]
432        OWGUI.rubber(self.controlArea)
433
434        box = OWGUI.widgetBox(self.controlArea, 'Expression Type')
435        self.expressionTypesCB = cb = OWGUI.comboBox(box, self, "ctypei", items=[], debuggingEnabled=0, callback=self.UpdateCached)
436
437
438        OWGUI.checkBox(self.controlArea, self, "excludeconstant", "Exclude labels with constant values" )
439        OWGUI.checkBox(self.controlArea, self, "joinreplicates", "Average replicates (use median)" )
440        OWGUI.checkBox(self.controlArea, self, "log2", "Logarithmic (base 2) transformation" )
441
442        self.commit_button = OWGUI.button(self.controlArea, self, "&Commit", callback=self.Commit)
443        self.commit_button.setDisabled(True)
444
445        OWGUI.rubber(self.controlArea)
446        OWGUI.rubber(self.controlArea)
447        OWGUI.rubber(self.controlArea)
448        OWGUI.rubber(self.controlArea)
449
450        box  = OWGUI.widgetBox(self.controlArea, "Authentication")
451
452        OWGUI.lineEdit(box, self, "username", "Username:", labelWidth=100, orientation='horizontal', callback=self.AuthChanged)
453        self.passf = OWGUI.lineEdit(box, self, "password", "Password:", labelWidth=100, orientation='horizontal', callback=self.AuthChanged)
454        self.passf.setEchoMode(QLineEdit.Password)
455
456        OWGUI.lineEdit(self.mainArea, self, "searchString", "Search", callbackOnType=True, callback=self.SearchUpdate)
457        self.headerLabels = ["", "Name", "Species", "Strain", "Experiment", "Genotype", "Treatment", "Growth", "Timepoint", "Replicate", "ID",
458                             "Date RNA", "Adapter", "Who", "Date Rep", "Band", "Amount", "Experimenter","Polya", "Primer", "Shearing", "Unit"]
459        self.experimentsWidget = QTreeWidget()
460        self.experimentsWidget.setHeaderLabels(self.headerLabels)
461        self.experimentsWidget.setSelectionMode(QTreeWidget.ExtendedSelection)
462        self.experimentsWidget.setRootIsDecorated(False)
463        self.experimentsWidget.setSortingEnabled(True)
464        contextEventFilter = OWGUI.VisibleHeaderSectionContextEventFilter(self.experimentsWidget, self.experimentsWidget)
465        self.experimentsWidget.header().installEventFilter(contextEventFilter)
466        self.experimentsWidget.setItemDelegateForColumn(0, OWGUI.IndicatorItemDelegate(self, role=Qt.DisplayRole))
467        self.experimentsWidget.setAlternatingRowColors(True)
468       
469        self.connect(self.experimentsWidget.selectionModel(),
470                     SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
471                     self.onSelectionChanged)
472
473        self.selectionSetsWidget.setSelectionModel(self.experimentsWidget.selectionModel())
474
475        self.mainArea.layout().addWidget(self.experimentsWidget)
476
477        self.loadSettings()
478       
479        self.restoreHeaderState()
480       
481        self.connect(self.experimentsWidget.header(), SIGNAL("geometriesChanged()"), self.saveHeaderState)
482       
483        self.dbc = None
484
485        self.AuthSet()
486
487        QTimer.singleShot(100, self.UpdateExperiments)
488
489        self.resize(800, 600)       
490
491    def __updateSelectionList(self, oldList, oldSelection, newList):
492        oldList = [oldList[i] for i in oldSelection]
493        return [ i for i, new in enumerate(newList) if new in oldList]
494   
495    def AuthSet(self):
496        if len(self.username):
497            self.passf.setDisabled(False)
498        else:
499            self.passf.setDisabled(True)
500
501    def AuthChanged(self):
502        self.AuthSet()
503        self.ConnectAndUpdate()
504
505    def ConnectAndUpdate(self):
506        self.Connect()
507        self.UpdateExperiments(reload=True)
508
509    def Connect(self):
510
511        self.error(1)
512        self.warning(1)
513
514        def en(x):
515            return x if len(x) else None
516
517        self.dbc = obiDicty.PIPA(buffer=self.buffer, username=en(self.username), password=self.password)
518
519        #check password
520        if en(self.username) != None:
521            try:
522                self.dbc.annotations(reload=True)
523            except obiDicty.AuthenticationError:
524                self.error(1, "Wrong username or password")
525                self.dbc = None
526            except Exception, ex:
527                print "Error when contacting the PIPA database", ex
528                import traceback
529                print traceback.format_exc()
530                try: #mable cached?
531                    self.dbc.annotations()
532                    self.warning(1, "Can not access database - using cached data.")
533                except Exception,ex:
534                    self.dbc = None
535                    self.error(1, "Can not access database.")
536
537    def Reload(self):
538        #self.buffer.clear()
539        self.UpdateExperiments(reload=True)
540
541    def clear_cache(self):
542        self.buffer.clear()
543        self.Reload()
544
545    def ctype(self):
546        """ Returns selected experiment type """
547        if self.exTypes:
548            return self.exTypes[self.ctypei][0]
549        else:
550            return "-1"
551
552    def UpdateExperimentTypes(self):
553        self.signalManager.freeze(self).push() #setFreeze(1)
554        try:
555            self.expressionTypesCB.clear()
556            items = [desc for _,desc,_ in self.exTypes]
557            self.expressionTypesCB.addItems(items)
558        except IOError:
559            pass
560        finally:
561            self.signalManager.freeze(self).pop() #setFreeze(0)
562        self.ctypei = max(0, min(self.ctypei, len(self.exTypes)-1))
563
564    def UpdateExperiments(self, reload=False):
565
566        self.chipsl = []
567        self.experimentsWidget.clear()
568        self.items = []
569
570        self.progressBarInit()
571
572        if not self.dbc:
573            self.Connect()
574 
575        annots = {}
576        exTypes = []
577       
578        sucind = False #success indicator for database index
579
580        try:
581            annots = self.dbc.annotations(chips, reload=reload)
582            exTypes = self.dbc.gene_expression_types(reload=reload)
583            sucind = True
584        except Exception, ex:
585            try:
586                annots = self.dbc.annotations()
587                exTypes = self.dbc.gene_expression_types()
588                self.warning(0, "Can not access database - using cached data.")
589                sucind = True
590            except Exception,ex:
591                self.error(0, "Can not access database.")
592
593        if sucind:
594            self.warning(0)
595            self.error(0)
596
597        self.annots = annots
598        self.exTypes = exTypes
599
600        self.UpdateExperimentTypes() 
601
602        elements = []
603        pos = 0
604
605        for chip,annot in self.annots.items():
606            pos += 1
607            d = defaultdict(lambda: "?", annot)
608            elements.append(["", d["name"], d["species"], d["strain"], d["Experiment"], d["genotype"], d["treatment"], d["growth"], d["tp"], d["replicate"], chip] + \
609                             [d[label.lower().replace(" ", "_")] for label in ["Date RNA", "Adapter", "Who", "Date Rep", "Band", "Amount", "Experimenter", "Polya", "Primer", "Shearing", "Unit"]])
610           
611#            self.progressBarSet((100.0 * pos) / len(chips))
612           
613            el = elements[-1]
614            ci = MyTreeWidgetItem(self.experimentsWidget, el)
615
616            self.items.append(ci)
617
618        for i in range(len(self.headerLabels)):
619            self.experimentsWidget.resizeColumnToContents(i)
620
621        #which is the ok buffer version
622        self.wantbufver = lambda x,ad=self.annots: defaultdict(lambda: "?", ad[x])["date"] #FIXME what attribute to use for version?
623
624        self.UpdateCached()
625
626        self.progressBarFinished()
627       
628        if self.currentSelection:
629            self.currentSelection.select(self.experimentsWidget.selectionModel())
630
631        self.handle_commit_button()
632
633    def UpdateCached(self):
634        if self.wantbufver and self.dbc:
635            fn = self.dbc.chips_keynaming(self.ctype())
636
637            for item in self.items:
638                c = str(item.text(10))
639                item.setData(0, Qt.DisplayRole, QVariant(" " if self.dbc.inBuffer(fn(c)) == self.wantbufver(c) else ""))
640
641    def SearchUpdate(self, string=""):
642        for item in self.items:
643            item.setHidden(not all(s in item for s in self.searchString.split()))
644
645    def Commit(self):
646        if not self.dbc:
647            self.Connect()
648        allTables = []
649
650        import time
651        start = time.time()
652
653        pb = OWGUI.ProgressBar(self, iterations=1000)
654
655        table = None
656
657        ids = []
658        for item in self.experimentsWidget.selectedItems():
659            ids += [ str(item.text(10)) ]
660
661        transfn = None
662        if self.log2:
663            transfn = lambda x: math.log(x+1.0, 2)
664       
665        keys = {"Strain": "strain", "Genotype": "genotype", "Treatment": "treatment", "Timepoint": "tp", "Growth": "growth", "Replicate": "replicate", 
666                "Species": "species", "Name": "name", "Date RNA": "date_rna", "Adapter":"adapter",
667                "Who": "who", "Date Rep": "date_rep", "Band": "band", "Amount": "amount", "Experimenter":"experimenter",
668                "Polya": "polya", "Primer": "primer", "Shearing": "shearing", "Unit": "unit", "Experiment":"Experiment"}
669       
670        hview = self.experimentsWidget.header()
671        shownHeaders = [label for i, label in list(enumerate(self.headerLabels))[1:] if not hview.isSectionHidden(i)]
672        allowed_labels = [keys.get(label, label) for label in shownHeaders]
673       
674        if self.joinreplicates and "id" not in allowed_labels:
675            # need 'id' labels in join_replicates for attribute names
676            allowed_labels.append("id")
677       
678        if len(ids):
679            table = self.dbc.get_data(ids=ids, callback=pb.advance, exclude_constant_labels=self.excludeconstant, bufver=self.wantbufver, transform=transfn, allowed_labels=allowed_labels, ctype=self.ctype())
680
681            if self.joinreplicates:
682                table = obiDicty.join_replicates(table, ignorenames=["replicate", "id", "name", "map_stop1"], namefn=None, avg=obiDicty.median)
683
684            end = int(time.time()-start)
685           
686
687            # Sort attributes
688            sortOrder = self.columnsSortingWidget.sortingOrder
689            # print sortOrder
690           
691            attributes = sorted(table.domain.attributes, key=lambda attr: tuple([attr.attributes.get(keys[name], "") for name in sortOrder]))
692            domain = orange.Domain(attributes, table.domain.classVar)
693            domain.addmetas(table.domain.getmetas())
694            table = orange.ExampleTable(domain, table)
695           
696            from orngDataCaching import data_hints
697            data_hints.set_hint(table, "taxid", "352472") 
698            data_hints.set_hint(table, "genesinrows", False)
699           
700            self.send("Example table", table)
701
702            self.UpdateCached()
703
704        pb.finish()
705
706    def onSelectionChanged(self, selected, deselected):
707        self.handle_commit_button()
708       
709    def handle_commit_button(self):
710        self.currentSelection = SelectionByKey(self.experimentsWidget.selectionModel().selection(),
711                                               key=(1, 2, 3, 10))
712        self.commit_button.setDisabled(not len(self.currentSelection))
713
714    def saveHeaderState(self):
715        hview = self.experimentsWidget.header()
716        for i, label in enumerate(self.headerLabels):
717            self.experimentsHeaderState[label] = hview.isSectionHidden(i)
718           
719    def restoreHeaderState(self):
720        hview = self.experimentsWidget.header()
721        for i, label in enumerate(self.headerLabels): 
722            hview.setSectionHidden(i, self.experimentsHeaderState.get(label, True))
723            self.experimentsWidget.resizeColumnToContents(i)
724           
725if __name__ == "__main__":
726    app  = QApplication(sys.argv)
727##    from pywin.debugger import set_trace
728##    set_trace()
729    obiDicty.verbose = True
730    w = OWPIPA()
731    w.show()
732    app.exec_()
733    w.saveSettings()
734           
735       
Note: See TracBrowser for help on using the repository browser.