Changeset 1386:ee024faf9aa8 in orange-bioinformatics


Ignore:
Timestamp:
05/12/11 14:35:17 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
85167180b6f05f2ba9661b8c348f7a16d4a70346
Message:

Output the data with the labeled genotype attributes.
Add missing attributes if not present in the input.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • widgets/OWGenotypeDistances.py

    r1378 r1386  
    1212 
    1313from collections import defaultdict 
     14from operator import add 
    1415import numpy 
    1516import math 
     
    104105    l = [ [ None ] * len(data) if id1 == None \ 
    105106        else [ float_or_none(ex[id1]) for ex in data ] for id1 in ids ] 
    106     l = reduce(lambda x,y: x+y, l) 
     107#    l = reduce(lambda x,y: x+y, l) 
     108    l = reduce(add, l) 
    107109    return l 
    108110 
     
    124126 
    125127def dist_eucl(l1, l2): 
    126     return euclidean_lists(l1, l2)     
     128    return euclidean_lists(l1, l2) 
     129 
     130 
     131def clone_attr(attr): 
     132    newattr = attr.clone() 
     133    def get_value_from(ex, w=None): 
     134        if attr in ex.domain: 
     135            v = str(ex[attr]) 
     136        else: 
     137            v = "?" 
     138        return newattr(v) 
     139         
     140    newattr.get_value_from = get_value_from 
     141    newattr.source_variable = attr 
     142    newattr.attributes.update(attr.attributes) 
     143    return newattr 
     144     
     145def missing_name_gen(): 
     146    i = 1 
     147    while True: 
     148        yield "missing {0}".format(i) 
     149        i += 1 
     150         
     151missing_name_gen = missing_name_gen() 
    127152 
    128153class MyHeaderView(QHeaderView): 
     
    135160    def wheelEvent(self, event): 
    136161        event.ignore() 
     162         
    137163         
    138164class SetContextHandler(ContextHandler): 
     
    141167        saved_items = set(getattr(context, "items", [])) 
    142168        if imperfect: 
    143             return len(items.intersection(saved_items))/len(items.union(saved_items)) 
     169            return float(len(items.intersection(saved_items)))/(len(items.union(saved_items)) or 1) 
    144170        else: 
    145171            return items == saved_items 
     
    161187class OWGenotypeDistances(OWWidget): 
    162188    contextHandlers = {"": SetContextHandler("")} 
    163     settingsList = [] 
     189    settingsList = ["auto_commit"] 
    164190     
    165191    DISTANCE_FUNCTIONS = [("Pearson correlation", dist_pcorr), 
     
    170196         
    171197        self.inputs = [("Example Table", ExampleTable, self.set_data)] 
    172         self.outputs = [("Distances", Orange.core.SymMatrix)] 
     198        self.outputs = [("Distances", Orange.core.SymMatrix), ("Sorted Example Table", ExampleTable)] 
    173199         
    174200        self.distance_measure = 0 
     
    210236         
    211237        b = OWGUI.button(box, self, "Commit", 
    212                          tooltip="Compute and send the distances.", 
     238                         tooltip="Compute the distances and send the output signals.", 
    213239                         callback=self.commit, 
    214240                         default=True) 
     
    223249        self.partitions = [] 
    224250        self.matrix = None 
     251        self.split_groups = [] 
    225252        self._disable_updates = False 
    226253         
     
    230257        self.data = None 
    231258        self.partitions = [] 
     259        self.split_groups = [] 
    232260        self.matrix = None 
    233261        self.send("Distances", None) 
     
    270298            self.groups_scroll_area.setWidget(QWidget()) 
    271299            self.info_box.setText("No data on input.\n") 
    272              
    273         self.commit_if() 
     300            self.commit() 
    274301             
    275302    def update_control(self): 
    276303        """ Update the control area of the widget. Populate the list 
    277304        views with keys from attribute labels. 
    278         """ 
    279 #        attrs = [attr.attributes.items() for attr in self.data.domain.attributes] 
    280 #        attrs = reduce(set.union, attrs, set()) 
    281 #        values = defaultdict(set) 
    282 #        for key, value in attrs: 
    283 #            values[key].add(value) 
    284 #        keys = [key for key in values if len(values[key]) > 1] 
     305         
     306        """ 
    285307        keys = self.get_suitable_keys(self.data) 
    286308          
     
    368390                    for i,v in enumerate(x[0]))) 
    369391 
    370         split_data = [] 
     392        split_groups = [] 
    371393         
    372394        # Collect relevant key value pairs for all columns 
     
    381403        def get_attr(attr_index, i): 
    382404            if attr_index is None: 
    383                 attr = Orange.data.variable.Continuous("missing") 
     405                attr = Orange.data.variable.Continuous(missing_name_gen.next()) 
    384406                attr.attributes.update(relevant_items.get(i, [])) 
    385407                return attr 
     
    390412            attrs = [get_attr(attr_index, i) for i, attr_index in enumerate(indices)] 
    391413            domain = Orange.data.Domain(attrs, None) 
    392             newdata = Orange.data.Table(domain)#, self.data) 
    393             split_data.append((keys, newdata)) 
    394              
    395         self.set_groups(separate_keys, split_data, relevant_keys) 
     414            domain.add_metas(self.data.domain.get_metas().items()) 
     415#            newdata = Orange.data.Table(domain) 
     416            split_groups.append((keys, domain)) 
     417             
     418        self.set_groups(separate_keys, split_groups, relevant_keys) 
    396419         
    397420        self.partitions = partitions 
     421        self.split_groups = split_groups 
     422         
     423        self.commit_if() 
    398424#        self.update_distances(separate_keys, partitions, self.data) 
    399425         
     
    405431        header_views = [] 
    406432        palette = self.palette() 
    407         for ann_vals, table in groups: 
     433        for ann_vals, domain in groups: 
    408434            label = QLabel(" <b>|</b> ".join(["<b>{0}</ b> = {1}".format(key,val) \ 
    409435                                     for key, val in zip(keys, ann_vals)])) 
    410436             
    411437            model = QStandardItemModel() 
    412             for i, attr in enumerate(table.domain.attributes): 
     438            for i, attr in enumerate(domain.attributes): 
    413439                item = QStandardItem() 
    414                 if attr.name != "missing": 
     440                if not str(attr.name).startswith("missing "): ## TODO: Change this to not depend on name 
    415441                    header_text = ["{0}={1}".format(key, attr.attributes.get(key, "?")) \ 
    416442                                   for key in relevant_keys] 
     
    420446                     
    421447                else: 
    422 #                    header_text = "\n".join("{0}=?".format(key) for key in relevant_keys) 
    423448                    header_text = ["{0}={1}".format(key, attr.attributes.get(key, "?")) \ 
    424449                                   for key in relevant_keys] 
     
    426451                    item.setData(QVariant(header_text), Qt.DisplayRole) 
    427452                    item.setFlags(Qt.NoItemFlags) 
    428                      
    429 #                    item.setData(QVariant(palette.color(QPalette.Disabled, QPalette.Text)), Qt.ForegroundRole) 
    430453                    item.setData(QVariant(QColor(Qt.red)), Qt.ForegroundRole) 
    431 #                    item.setData(QVariant(QColor(Qt.red)), Qt.BackgroundRole) 
    432454                    item.setData(QVariant(palette.color(QPalette.Disabled, QPalette.Window)), Qt.BackgroundRole) 
    433455                    item.setData(QVariant("Missing feature."), Qt.ToolTipRole) 
    434456                 
    435457                model.setHorizontalHeaderItem(i, item) 
    436             attr_count = len(table.domain.attributes) 
     458            attr_count = len(domain.attributes) 
    437459            view = MyHeaderView(Qt.Horizontal) 
    438460            view.setResizeMode(QHeaderView.Fixed) 
     
    497519                      for values, _ in partitions] 
    498520            items = [" | ".join(item) for item in items] 
    499             matrix.items = items 
     521            matrix.setattr("items", items) 
    500522        else: 
    501523            matrix = None 
     
    510532             
    511533    def commit(self): 
    512         self.compute_distances(self.selected_separeate_by_keys(), 
     534        separate_keys = self.selected_separeate_by_keys() 
     535        self.compute_distances(separate_keys, 
    513536                               self.partitions, 
    514537                               self.data) 
     538         
     539        if self.split_groups: 
     540            all_attrs = [] 
     541            for group, domain in self.split_groups: 
     542                attrs = [] 
     543                group_name = " | ".join("{0}={1}".format(*item) for item in \ 
     544                                        zip(separate_keys, group)) 
     545                for attr in domain.attributes: 
     546                    newattr = clone_attr(attr) 
     547                    newattr.attributes["$(GROUP)"] = group_name # Need a better way to pass the groups to downstream widgets. 
     548                    attrs.append(newattr) 
     549                     
     550                all_attrs.extend(attrs) 
     551                 
     552            #all_attrs = reduce(add, [list(domain.attributes) for _, domain in self.split_groups], []) 
     553            domain = Orange.data.Domain(all_attrs, self.data.domain.class_var) 
     554            domain.add_metas(self.data.domain.get_metas().items()) 
     555             
     556            data = Orange.data.Table(domain, self.data) 
     557        else: 
     558            data = None 
     559        self.send("Sorted Example Table", data) 
    515560        self.send("Distances", self.matrix) 
    516561        self.changed_flag = False 
Note: See TracChangeset for help on using the changeset viewer.