source: orange-bioinformatics/orangecontrib/bio/widgets/OWPIPA.py @ 1874:b3e32cc5cf6f

Revision 1874:b3e32cc5cf6f, 28.7 KB checked in by Ales Erjavec <ales.erjavec@…>, 6 months ago (diff)

Added new style widget meta descriptions.

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