Changeset 1346:99978b5d0d5f in orange-bioinformatics


Ignore:
Timestamp:
03/11/11 17:28:29 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
5af333401d00c3602c7f92e18c544e4aa00a9297
Message:

Fixed sample selection (only select samples that have a selected sample annotation value from all sample types, unless no value is selected (in this case ignore the sample type))

File:
1 edited

Legend:

Unmodified
Added
Removed
  • widgets/OWGEODatasets.py

    r1343 r1346  
    7979from OWGUI import LinkStyledItemDelegate, LinkRole 
    8080 
     81def childiter(item): 
     82    """ Iterate over the children of an QTreeWidgetItem instance. 
     83    """ 
     84    for i in range(item.childCount()): 
     85        yield item.child(i) 
     86                 
    8187class OWGEODatasets(OWWidget): 
    8288    settingsList = ["outputRows", "mergeSpots", "gdsSelectionStates", "splitterSettings", "currentGds", "autoCommit"] 
     
    306312        self.updateInfo() 
    307313 
     314    def selectedSamples(self): 
     315        """ Return the currently selected sample annotations (list of 
     316        sample type, sample value tuples). 
     317         
     318        .. note:: if some Sample annotation type has no selected values. 
     319                  this method will return all values for it. 
     320         
     321        """ 
     322        samples = [] 
     323        unused_types = [] 
     324        for stype in childiter(self.annotationsTree.invisibleRootItem()): 
     325            selected_values = [] 
     326            all_values = [] 
     327            for sval in childiter(stype): 
     328                value = (str(stype.text(0)), str(sval.text(0))) 
     329                if self.gdsSelectionStates.get(sval.key, True): 
     330                    selected_values.append(value) 
     331                all_values.append(value) 
     332            if selected_values: 
     333                samples.extend(selected_values) 
     334            else: 
     335                # If no sample of sample type is selected we don't filter on it. 
     336                samples.extend(all_values) 
     337                unused_types.append(str(stype.text(0))) 
     338                 
     339        return samples 
     340     
    308341    def commitIf(self): 
    309342        if self.autoCommit: 
     
    312345            self.selectionChanged = True 
    313346             
    314     def commit(self): 
    315         if self.currentGds: 
    316 #            classes = [s["description"] for s in self.currentGds["subsets"]] 
    317 #            classes = [classes[i] for i in self.selectedSubsets] or None 
    318 #            sample_type = self.annotationCombo.currentText() 
    319             sample_type = None 
    320             self.progressBarInit() 
    321             self.progressBarSet(10) 
    322              
    323             def getdata(gds_id, **kwargs): 
    324                 gds = obiGEO.GDS(gds_id) 
    325                 data = gds.getdata(**kwargs) 
    326                 return data 
    327             from OWConcurrent import createTask 
    328             self.setEnabled(False) 
    329             qApp.processEvents() 
    330             self.get_data_async = createTask(getdata, (self.currentGds["dataset_id"],), dict(report_genes=self.mergeSpots, 
    331                                                                    transpose=self.outputRows, 
    332                                                                    sample_type=sample_type if sample_type!="Include all" else None), 
    333                                              onResult=self.onData, onFinished=lambda: self.setEnabled(True), 
    334                                              threadPool=QThreadPool.globalInstance() 
    335                                              ) 
    336             
     347#    def commit(self): 
     348#        if self.currentGds: 
     349##            classes = [s["description"] for s in self.currentGds["subsets"]] 
     350##            classes = [classes[i] for i in self.selectedSubsets] or None 
     351##            sample_type = self.annotationCombo.currentText() 
     352#            sample_type = None 
     353#            self.progressBarInit() 
     354#            self.progressBarSet(10) 
     355#             
     356#            def getdata(gds_id, **kwargs): 
     357#                gds = obiGEO.GDS(gds_id) 
     358#                data = gds.getdata(**kwargs) 
     359#                return data 
     360#            from OWConcurrent import createTask 
     361#            self.setEnabled(False) 
     362#            qApp.processEvents() 
     363#            self.get_data_async = createTask(getdata, (self.currentGds["dataset_id"],), dict(report_genes=self.mergeSpots, 
     364#                                                                   transpose=self.outputRows, 
     365#                                                                   sample_type=sample_type if sample_type!="Include all" else None), 
     366#                                             onResult=self.onData, onFinished=lambda: self.setEnabled(True), 
     367#                                             threadPool=QThreadPool.globalInstance() 
     368#                                             ) 
     369     
    337370    def commit(self): 
    338371        if self.currentGds: 
     
    348381             
    349382            self.setEnabled(False) 
    350 #            qApp.processEvents() 
    351383            call = self.asyncCall(getdata, (self.currentGds["dataset_id"],), dict(report_genes=self.mergeSpots, 
    352384                                           transpose=self.outputRows, 
     
    373405    def onData(self, data): 
    374406        self.progressBarSet(50) 
    375 #            samples = set([self.annotationsTree.topLevelItem(i).child(j).key[2] for i in range(self.annotationsTree.topLevelItemCount()) for j in self.annotationsTree.topLevelItem(i).]) 
    376         class itemiter(QTreeWidgetItemIterator): 
    377             def next(self): 
    378                 self.__iadd__(1) 
    379                 if self.value(): 
    380                     return self.value() 
    381                 else: 
    382                     raise StopIteration 
    383             def __iter__(self): 
    384                 return self 
    385              
    386         samples = set([str(item.text(0)) for item in itemiter(self.annotationsTree) if self.gdsSelectionStates.get(item.key, True)]) 
    387          
     407         
     408        samples = self.selectedSamples() 
     409         
     410        message = None 
    388411        if self.outputRows: 
    389             select = [1 if samples.intersection(str(ex.getclass()).split("|")) else 0 for ex in data] 
     412            samples = set(s[1] for s in samples) # dont have info on sample types in the data class variable 
     413            select = [1 if samples.issuperset(str(ex.getclass()).split("|")) else 0 for ex in data] 
    390414            data = data.select(select) 
     415            # TODO: add sample types as separate features   
    391416            data.domain.classVar.values = ["|".join([cl for cl in val.split("|") if cl in samples]) for val in data.domain.classVar.values] 
     417            if len(data) == 0: 
     418                message = "No selected samples with selected sample annotations." 
    392419        else: 
    393             domain = orange.Domain([attr for attr in data.domain.attributes if samples.intersection(attr.attributes.values())], data.domain.classVar) 
     420            samples = set(samples) 
     421            domain = orange.Domain([attr for attr in data.domain.attributes if samples.issuperset(attr.attributes.items())], data.domain.classVar) 
    394422            domain.addmetas(data.domain.getmetas()) 
     423            stypes = set(s[0] for s in samples) 
    395424            for attr in domain.attributes: 
    396                 attr.attributes = dict([(key, value) for key, value in attr.attributes.items() if value in samples]) 
     425                attr.attributes = dict([(key, value) for key, value in attr.attributes.items() if key in stypes]) 
    397426            data = orange.ExampleTable(domain, data) 
    398427 
Note: See TracChangeset for help on using the changeset viewer.