source: orange-bioinformatics/_bioinformatics/widgets/prototypes/OWCustomSets.py @ 1816:1ddb05ba025a

Revision 1816:1ddb05ba025a, 8.5 KB checked in by Flashpoint <vid.flashpoint@…>, 11 months ago (diff)

Changed the hierarchy name of Custom gene sets in obiGeneSets.py. Moved the statistics information about genesets into an info bar.

Line 
1"""
2<name>Custom Gene Sets</name>
3<description>Manage custom geneset files</description>
4<icon></icon>
5<contact>Vid Jelen (vid.jelen1@gmail.com)</contact>
6"""
7import os
8from StringIO import StringIO
9
10import Orange
11import cPickle as pickle
12
13from OWWidget import *
14import OWGUI
15
16from Orange.bio.obiGeneSets import loadGMT, list_local, register, local_path, remove_local, modification_date, getGenesetsStats
17
18class standard_icons(object):
19    def __init__(self, qwidget=None, style=None):
20        self.qwidget = qwidget
21        if qwidget is None:
22            self.style = QApplication.instance().style()
23        else:
24            self.style = qwidget.style()
25
26    @property
27    def dir_open_icon(self):
28        return self.style.standardIcon(QStyle.SP_DirOpenIcon)
29
30    @property
31    def reload_icon(self):
32        return self.style.standardIcon(QStyle.SP_BrowserReload)
33
34
35class OWCustomSets(OWWidget):
36    settingsList = ["recent_files"]
37
38    def __init__(self, parent=None, signalManager=None,
39                 title="Custom Geneset File (*.gmt) Manager"):
40        OWWidget.__init__(self, parent, signalManager, title,
41                          wantMainArea=True)
42
43        self.inputs = []
44        self.outputs = []
45        self.new_geneset = set()
46
47        # List of recent opened files.
48        self.recent_files = []
49        self.loadSettings()
50        try:
51            self.recent_files = filter(os.path.exists, self.recent_files)
52        except:
53            pass
54
55
56        layout = QHBoxLayout()
57        box = OWGUI.widgetBox(self.controlArea, "File", orientation=layout)
58
59        icons = standard_icons(self)
60
61        self.recent_combo = QComboBox(self, objectName="recent_combo",
62                                      toolTip="Recent files",
63                                      activated=self.on_select_recent)
64        self.recent_combo.addItems([os.path.basename(p) \
65                                    for p in self.recent_files])
66
67        self.browse_button = QPushButton("...", icon=icons.dir_open_icon,
68                                         toolTip="Browse filesystem",
69                                         clicked=self.on_open_dialog)
70
71        layout.addWidget(self.recent_combo, 2)
72        layout.addWidget(self.browse_button)
73       
74        # The preview field       
75        box = OWGUI.widgetBox(self.controlArea, "Preview")
76        self.preview_view = QPlainTextEdit()
77        self.preview_view.setReadOnly(True)
78        self.preview_view.setWordWrapMode(0)
79
80        box.layout().addWidget(self.preview_view)
81
82       
83        # The geneset table
84        ma = self.mainArea
85
86        self.listView = QTreeWidget(ma)
87        ma.layout().addWidget(self.listView)
88        self.listView.setAllColumnsShowFocus(1)
89        self.listView.setColumnCount(2)
90        self.listView.setHeaderLabels(["Name", "Import time"])
91
92        self.listView.header().setStretchLastSection(True)
93        self.listView.header().setClickable(True)
94        self.listView.header().setSortIndicatorShown(True)
95        self.listView.setSortingEnabled(True)
96
97        self.listView.setSelectionMode(QAbstractItemView.SingleSelection)
98        self.listView.setSelectionBehavior(QAbstractItemView.SelectRows)
99
100        self.populate_table()
101
102       
103        self.selected_file = None 
104
105        self.resize(450, 500)
106        if self.recent_files:
107            QTimer.singleShot(1,
108                    lambda: self.set_selected_file(self.recent_files[0])
109                    )
110
111        #Data Set info bar
112        info_box = OWGUI.widgetBox(self.controlArea, "Info")
113        self.info = OWGUI.widgetLabel(info_box, "No gene set selected")
114        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.selection)
115        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.update_preview)
116
117        info_box.layout().addWidget(self.info)       
118       
119        OWGUI.button(self.controlArea, self, "Import", callback=self.import_data)
120        OWGUI.button(self.controlArea, self, "Delete", callback=self.delete_data)
121
122    def selection(self): 
123        if self.listView.selectedItems():
124            self.info.clear()
125            name = self.listView.selectedItems()[0].text(0)           
126            for geneset in os.listdir(local_path()):
127                if geneset.__contains__(str(name)):
128                    the_file = os.path.join(local_path(), geneset) 
129                    sets = pickle.load(open(the_file, "rb"))
130                    stats = getGenesetsStats(sets)
131                    num_sets, uniq_genes, avg_genes = str(stats[0]), str(stats[1]), str(stats[2])
132                    break
133            self.info.setText("Gene Sets: %d\nUnique Genes: %d\nAverage no. of Genes/Gene Set: %d" % (int(num_sets), int(uniq_genes), int(avg_genes)))
134        else:
135            self.info.setText("No gene set selected")
136
137
138    def populate_table(self):
139        self.listView.clear()
140        for geneset in os.listdir(local_path()):
141            item = QTreeWidgetItem(self.listView)
142            name = geneset[geneset.index("_._")+3:geneset.index(".gmt")+4]
143            the_file = os.path.join(local_path(), geneset)
144            mod_time = str(modification_date(the_file))
145            item.setText(0, name)
146            item.setText(1, mod_time[:mod_time.rfind(".")])
147
148    def on_select_recent(self, recent):
149        if isinstance(recent, int):
150            recent = self.recent_files[recent]
151
152        self.set_selected_file(recent)
153
154    def on_open_dialog(self):
155        last = os.path.expanduser("~/Documents")
156        path = QFileDialog.getOpenFileName(self, "Open File","" ,"geneset file *.gmt (*.gmt);;All files (*)", last)
157        path = unicode(path)
158        if path:
159            self.set_selected_file(path)
160
161    def on_reload_file(self):
162        if self.recent_files:
163            self.set_selected_file(self.recent_files[0])
164
165    def set_selected_file(self, filename):
166        basedir, name = os.path.split(filename)
167        self.selected_file = filename
168        self.genesetname = name
169        index_to_remove = None
170        if filename in self.recent_files:
171            index_to_remove = self.recent_files.index(filename)
172        elif self.recent_combo.count() > 6:
173            # Always keep 6 latest files in the list.
174            index_to_remove = self.recent_combo.count() - 1
175        self.recent_combo.insertItem(0, name)
176        self.recent_combo.setCurrentIndex(0)
177        self.recent_files.insert(0, filename)
178
179        if index_to_remove is not None:
180            self.recent_combo.removeItem(index_to_remove + 1)
181            self.recent_files.pop(index_to_remove + 1)
182       
183    def update_preview(self):
184        if self.listView.selectedItems():
185            final_text = ""
186            self.preview_view.clear()
187            name = self.listView.selectedItems()[0].text(0)           
188            for geneset in os.listdir(local_path()):
189                if geneset.__contains__(str(name)):
190                    the_file = os.path.join(local_path(), geneset) 
191                    sets = pickle.load(open(the_file, "rb"))
192                    break
193            for geneset in sets:
194                final_text += geneset.id + "(%d genes)\n" % len(geneset.genes)
195                final_text += ", ".join([geneset.genes.pop() for i in range(5)]) + ", ...\n\n"
196            final_text += "..."
197            self.preview_view.setPlainText(final_text)
198        else:
199            self.preview_view.clear()
200
201    def import_data(self):   
202        self.error(0)     
203        if self.selected_file:
204            try:
205                self.new_geneset = loadGMT(open(self.selected_file, "rt").read(), self.genesetname)
206                geneset_split = self.new_geneset.split_by_hierarchy()
207                for geneset in geneset_split:
208                    register(geneset)
209                self.populate_table()
210            except Exception, ex:
211                self.error(0, "An error occurred while "
212                              "loading the file:\n\t%r" % self.selected_file
213                              )   
214
215    def delete_data(self):   
216        self.error(0)
217        if self.listView.selectedItems():
218            try:
219                unwantedGeneset = str(self.listView.selectedItems()[0].text(0))
220                remove_local(unwantedGeneset)
221                self.populate_table()
222            except Exception, ex:
223                self.error(0, "An error occurred while "
224                              "deleting the file:\n\t%r" % unwantedGeneset
225                              )   
226       
227if __name__ == "__main__":
228    import sys
229    app = QApplication(sys.argv)
230    w = OWCustomSets()
231    w.show()
232    app.exec_()
233    w.saveSettings()
Note: See TracBrowser for help on using the repository browser.