source: orange-bioinformatics/_bioinformatics/widgets/prototypes/OWCustomSets.py @ 1820:8d6175dc404b

Revision 1820:8d6175dc404b, 7.2 KB checked in by Flashpoint <vid.flashpoint@…>, 10 months ago (diff)

Fixed the bug of having less than 5 genes in a geneset

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
37    def __init__(self, parent=None, signalManager=None,
38                 title="Custom Geneset File (*.gmt) Manager"):
39        OWWidget.__init__(self, parent, signalManager, title,
40                          wantMainArea=True)
41
42        self.inputs = []
43        self.outputs = []
44        self.new_geneset = set()
45        self.selected_file = "" 
46
47        layout = QHBoxLayout()
48        box = OWGUI.widgetBox(self.controlArea, "Gene Set Import", orientation=layout)
49
50        icons = standard_icons(self)
51
52        self.browse_button = QPushButton(" ...", icon=icons.dir_open_icon,
53                                         toolTip="Browse filesystem",
54                                         clicked=self.on_open_dialog)
55
56        layout.addWidget(self.browse_button)
57       
58        # The preview field       
59        box = OWGUI.widgetBox(self.controlArea, "Imported Gene Sets")
60        self.preview_view = QTreeWidget()
61        self.preview_view.setAllColumnsShowFocus(1)
62        self.preview_view.setColumnCount(3)
63        self.preview_view.setHeaderLabels(["Name", "# of Genes", "Genes"])
64
65        self.preview_view.header().setStretchLastSection(True)
66        self.preview_view.header().setClickable(True)
67        self.preview_view.header().setSortIndicatorShown(True)
68        self.preview_view.setSortingEnabled(True)
69
70        # The geneset table
71        ma = self.mainArea
72
73        self.listView = QTreeWidget(ma)
74
75        # Adding the widgets into separate layouts
76        ma.layout().addWidget(self.preview_view)
77        box.layout().addWidget(self.listView)
78
79        self.listView.setAllColumnsShowFocus(1)
80        self.listView.setColumnCount(2)
81        self.listView.setHeaderLabels(["Name", "Import time"])
82
83        self.listView.header().setStretchLastSection(True)
84
85        self.listView.setSelectionMode(QAbstractItemView.SingleSelection)
86        self.listView.setSelectionBehavior(QAbstractItemView.SelectRows)
87
88        self.populate_table()
89
90        self.resize(800, 500)
91
92        #Data Set info bar
93        info_box = OWGUI.widgetBox(self.controlArea, "Info")
94        self.info = OWGUI.widgetLabel(info_box, "No gene set selected")
95        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.selection)
96        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.update_preview)
97
98        info_box.layout().addWidget(self.info)       
99       
100        OWGUI.button(self.controlArea, self, "Delete", callback=self.delete_data)
101
102    def selection(self): 
103        if self.listView.selectedItems():
104            self.info.clear()
105            name = self.listView.selectedItems()[0].text(0)           
106            for geneset in os.listdir(local_path()):
107                if geneset.__contains__(str(name)):
108                    the_file = os.path.join(local_path(), geneset) 
109                    sets = pickle.load(open(the_file, "rb"))
110                    stats = getGenesetsStats(sets)
111                    num_sets, uniq_genes, avg_genes = str(stats[0]), str(stats[1]), str(stats[2])
112                    break
113            self.info.setText("Gene Sets: %d\nUnique Genes: %d\nAverage Gene Set size: %d" % (int(num_sets), int(uniq_genes), int(avg_genes)))
114        else:
115            self.info.setText("No gene set selected")
116
117
118    def populate_table(self):
119        self.listView.clear()
120        for geneset in os.listdir(local_path()):
121            item = QTreeWidgetItem(self.listView)
122            name = geneset[geneset.index("_._")+3:geneset.index(".gmt")+4]
123            the_file = os.path.join(local_path(), geneset)
124            mod_time = str(modification_date(the_file))
125            item.setText(0, name)
126            item.setText(1, mod_time[:mod_time.rfind(".")])
127
128    def on_select_recent(self, recent):
129        if isinstance(recent, int):
130            recent = self.recent_files[recent]
131
132        self.set_selected_file(recent)
133
134    def on_open_dialog(self):
135        last = os.path.expanduser("~/Documents")
136        path = QFileDialog.getOpenFileName(self, "Open File","" ,"geneset file *.gmt (*.gmt);;All files (*)", last)
137        path = unicode(path)
138        if path:
139            self.set_selected_file(path)
140
141    def set_selected_file(self, filename):
142        basedir, name = os.path.split(filename)
143        self.selected_file = filename
144        self.genesetname = name
145           
146        self.import_data()
147                                                                   
148    def update_preview(self):
149        if self.listView.selectedItems():
150            final_text = ""
151            self.preview_view.clear()
152            name = self.listView.selectedItems()[0].text(0)           
153            for geneset in os.listdir(local_path()):
154                if geneset.__contains__(str(name)):
155                    the_file = os.path.join(local_path(), geneset) 
156                    sets = pickle.load(open(the_file, "rb"))
157                    break
158            for geneset in sets:
159                item = QTreeWidgetItem(self.preview_view)
160                item.setText(0, geneset.id)
161                item.setData(1, Qt.DisplayRole, len(geneset.genes))
162                item.setText(2, ", ".join(list(geneset.genes)[:5]) + ", ...")
163        else:
164            self.preview_view.clear()
165
166    def import_data(self):   
167        self.error(0)     
168        if self.selected_file:
169            try:
170                self.new_geneset = loadGMT(open(self.selected_file, "rt").read(), self.genesetname)
171                geneset_split = self.new_geneset.split_by_hierarchy()
172                for geneset in geneset_split:
173                    register(geneset)
174                self.populate_table()
175            except Exception, ex:
176                self.error(0, "An error occurred while "
177                              "loading the file:\n\t%r" % self.selected_file
178                              )   
179
180    def delete_data(self):   
181        self.error(0)
182        if self.listView.selectedItems():
183            try:
184                unwantedGeneset = str(self.listView.selectedItems()[0].text(0))
185                remove_local(unwantedGeneset)
186                self.populate_table()
187            except Exception, ex:
188                self.error(0, "An error occurred while "
189                              "deleting the file:\n\t%r" % unwantedGeneset
190                              )   
191       
192if __name__ == "__main__":
193    import sys
194    app = QApplication(sys.argv)
195    w = OWCustomSets()
196    w.show()
197    app.exec_()
198    w.saveSettings()
Note: See TracBrowser for help on using the repository browser.