Changeset 1879:3e9c962d89f8 in orange-bioinformatics for orangecontrib/bio/widgets/OWSetEnrichment.py


Ignore:
Timestamp:
10/10/13 13:10:39 (6 months ago)
Author:
Marko Toplak <marko.toplak@…>
Branch:
default
Parents:
1872:5518b82614e3 (diff), 1878:8b1e95b04793 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merged in ales_erjavec/orange-bioinformatics (pull request #2)

Move 'anonymous' _bioinformatics package into orangecontrib namespace

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orangecontrib/bio/widgets/OWSetEnrichment.py

    r1878 r1879  
    3232    return geneset.name if geneset.name else geneset.id 
    3333 
     34fmtp = lambda score: "%0.5f" % score if score > 10e-4 else "%0.1e" % score 
     35fmtpdet = lambda score: "%0.9f" % score if score > 10e-4 else "%0.5e" % score 
    3436 
    3537def _toPyObject(variant): 
     
    6365            return id(self) < id(other) 
    6466        column = self.treeWidget().sortColumn() 
    65         if column == 4: 
     67        if column in [4,5]: 
    6668            lhs = _toPyObject(self.data(column, 42)) 
    6769            rhs = _toPyObject(other.data(column, 42)) 
     
    8082 
    8183class OWSetEnrichment(OWWidget): 
    82     settingsList = ["speciesIndex", "genesinrows", "geneattr", "categoriesCheckState"] 
     84    settingsList = ["speciesIndex", "genesinrows", "geneattr", "categoriesCheckState", "useMinCountFilter", "useMaxPValFilter", "useMaxFDRFilter", "minClusterCount", "maxPValue", "maxFDR" ] 
    8385    contextHandlers = {"":DomainContextHandler("", ["speciesIndex", "genesinrows", "geneattr", "categoriesCheckState"])} 
    8486 
     
    98100        self.useMinCountFilter = True 
    99101        self.useMaxPValFilter = True 
    100         self.minClusterCount = 0 
     102        self.useMaxFDRFilter = True 
     103        self.minClusterCount = 3 
    101104        self.maxPValue = 0.01 
    102  
    103         self.useFDR = True 
     105        self.maxFDR = 0.01 
    104106 
    105107        self.categoriesCheckState = {} 
     
    160162        dsp, dspcb = OWGUI.doubleSpin(hWidget, self, 
    161163                        "maxPValue", 0.0, 1.0, 0.0001, 
    162                         label="FDR adjusted P-Value", 
    163                         tooltip="Maximum (FDR adjusted) P-Value", 
     164                        label="p-value", 
     165                        tooltip="Maximum p-value", 
    164166                        callback=self.filterAnnotationsChartView, 
    165167                        callbackOnReturn=True, 
    166168                        checked="useMaxPValFilter", 
     169                        checkCallback=self.filterAnnotationsChartView) 
     170 
     171        dsfdr, dsfdrcb = OWGUI.doubleSpin(hWidget, self, 
     172                        "maxFDR", 0.0, 1.0, 0.0001, 
     173                        label="FDR", 
     174                        tooltip="Maximum False discovery rate", 
     175                        callback=self.filterAnnotationsChartView, 
     176                        callbackOnReturn=True, 
     177                        checked="useMaxFDRFilter", 
    167178                        checkCallback=self.filterAnnotationsChartView) 
    168179 
     
    188199        self.annotationsChartView = MyTreeWidget(self) 
    189200        self.annotationsChartView.setHeaderLabels(["Category", "Term", 
    190                             "Count", "Reference count", "P-Value", "Enrichment"]) 
     201                            "Count", "Reference count", "p-value", "FDR", "Enrichment"]) 
    191202        self.annotationsChartView.setAlternatingRowColors(True) 
    192203        self.annotationsChartView.setSortingEnabled(True) 
     
    331342 
    332343    def subsetSelectionChanged(self, item, column): 
    333         #FIXME this should also recompute FDR 
    334344        self.categoriesCheckState = self.getHierarchyCheckState() 
    335345        categories = self.selectedCategories() 
     
    460470                self.progressBarSet(100.0 * i / len(collections)) 
    461471 
    462         if self.useFDR: 
    463             results = sorted(results, key=lambda a:a[1][2]) 
    464             pvals = obiProb.FDR([pval for _, (_, _, pval, _) in results]) 
    465             results = [(geneset, (cmapped, rmapped, pvals[i], es)) for i, (geneset, (cmapped, rmapped, _, es)) in enumerate(results)] 
    466  
    467         fmt = lambda score, max_decimals=10: "%%.%if" % min(int(abs(math.log(max(score, 1e-10)))) + 2, max_decimals) if score > math.pow(10, -max_decimals) and score < 1 else "%.1f" 
    468472        self.annotationsChartView.clear() 
    469473 
     
    471475        maxRefCount = max([len(rc) for _, (_, rc, _, _) in results] + [1]) 
    472476        countSpaces = int(math.ceil(math.log10(maxCount))) 
    473         #print maxRefCount 
    474477        refSpaces = int(math.ceil(math.log(maxRefCount))) 
    475478        countFmt = "%"+str(countSpaces) + "s  (%.2f%%)" 
     
    486489                item.setData(2, Qt.ToolTipRole, QVariant(len(cmapped))) # For filtering 
    487490                item.setData(3, Qt.DisplayRole, QVariant(refFmt % (len(rmapped), 100.0*len(rmapped)/len(referenceGenes)))) 
    488                 item.setData(4, Qt.DisplayRole, QVariant("%0.6f" % p_val)) if p_val > 0.001 else item.setData(4, Qt.DisplayRole, QVariant("%0.2e" % p_val)) 
    489                 item.setData(4, 42, QVariant(p_val)) #sorting 
    490                 item.setData(4, Qt.ToolTipRole, QVariant("%0.10f" % p_val)) 
    491                 item.setData(5, Qt.DisplayRole, QVariant(enrichment)) 
    492                 item.setData(5, Qt.ToolTipRole, QVariant("%.3f" % enrichment)) 
     491                item.setData(4, Qt.ToolTipRole, QVariant(fmtpdet(p_val))) 
     492                item.setData(4, Qt.DisplayRole, QVariant(fmtp(p_val))) 
     493                item.setData(4, 42, QVariant(p_val)) 
     494                #column 5, FDR, is computed in filterAnnotationsChartView 
     495                item.setData(6, Qt.DisplayRole, QVariant(enrichment)) 
     496                item.setData(6, Qt.ToolTipRole, QVariant("%.3f" % enrichment)) 
    493497                item.geneset= geneset 
    494498                self.treeItems.append(item) 
     
    508512        self.filterCompleter.setModel(completerModel) 
    509513 
    510         self.annotationsChartView.setItemDelegateForColumn(5, BarItemDelegate(self, scale=(0.0, max(t[1][3] for t in results)))) 
     514        self.annotationsChartView.setItemDelegateForColumn(6, BarItemDelegate(self, scale=(0.0, max(t[1][3] for t in results)))) 
    511515        self.annotationsChartView.setItemDelegateForColumn(1, LinkStyledItemDelegate(self.annotationsChartView)) 
    512516 
     
    524528        categories = set(" ".join(cat) for cat, taxid in self.selectedCategories()) 
    525529 
    526         #compute FDR after selection categories 
    527530     
    528531        filterString = str(self.filterLineEdit.text()).lower() 
    529         itemsHidden = [] 
     532 
     533        #hide categories 
     534        itemsHiddenCat = [] 
    530535        for item in self.treeItems: 
    531536            item_cat = str(item.data(0, Qt.EditRole).toString()) 
    532             count, pval = _toPyObject(item.data(2, Qt.ToolTipRole)), _toPyObject(item.data(4, 42)) 
    533537            geneset = gsname(item.geneset).lower() 
    534             hidden = item_cat not in categories or (self.useMinCountFilter and count < self.minClusterCount) or \ 
    535                      (self.useMaxPValFilter and pval > self.maxPValue) or filterString not in geneset 
     538            hidden = item_cat not in categories 
     539            itemsHiddenCat.append(hidden) 
     540         
     541        #compute FDR according the selected categories 
     542        pvals = [ _toPyObject(item.data(4, 42)) for item, hidden in zip(self.treeItems, itemsHiddenCat) if not hidden ] 
     543        fdrs = obiProb.FDR(pvals) 
     544 
     545        #update FDR for the selected collections and apply filtering rules 
     546        fdri = 0 
     547        itemsHidden = [] 
     548        for item, hidden in zip(self.treeItems, itemsHiddenCat): 
     549            if not hidden: 
     550                fdr = fdrs[fdri] 
     551                fdri += 1 
     552 
     553                count, pval = _toPyObject(item.data(2, Qt.ToolTipRole)), _toPyObject(item.data(4, 42)) 
     554 
     555                hidden = (self.useMinCountFilter and count < self.minClusterCount) or \ 
     556                         (self.useMaxPValFilter and pval > self.maxPValue) or \ 
     557                         (self.useMaxFDRFilter and fdr > self.maxFDR) 
     558                 
     559                if not hidden: 
     560                    item.setData(5, Qt.ToolTipRole, QVariant(fmtpdet(fdr))) 
     561                    item.setData(5, Qt.DisplayRole, QVariant(fmtp(fdr))) 
     562                    item.setData(5, 42, QVariant(fdr)) 
     563 
    536564            item.setHidden(hidden) 
    537565            itemsHidden.append(hidden) 
     566                 
    538567 
    539568        if self.treeItems and all(itemsHidden): 
     
    571600        self.reportSettings("Settings", [("Organism", obiTaxonomy.name(self.taxid_list[self.speciesIndex]))]) 
    572601        self.reportSettings("Filter", [("Min cluster size", self.minClusterCount if self.useMinCountFilter else 0), 
    573                                        ("Max p-value", self.maxPValue if self.useMaxPValFilter else 1.0)]) 
     602                                       ("Max p-value", self.maxPValue if self.useMaxPValFilter else 1.0), 
     603                                       ("Max FDR", self.maxFDR if self.useMaxFDRFilter else 1.0)]) 
    574604 
    575605        self.reportSubsection("Annotations") 
Note: See TracChangeset for help on using the changeset viewer.