Changeset 1484:eb5d88b94c45 in orange-bioinformatics


Ignore:
Timestamp:
09/30/11 14:14:37 (3 years ago)
Author:
markotoplak
Branch:
default
Convert:
1b1bc7de77974549fe5bf735d98889ccda5f2f64
Message:

OWGenotypeDistances: user interface now shows clearly what the output is
like.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • widgets/OWGenotypeDistances.py

    r1476 r1484  
    2525            return float 
    2626        except: 
    27             return None 
     27            return lambda x: x 
    2828 
    2929def separate_by(data, separate, ignore=[], consider=None, add_empty=True): 
     
    6363        if isinstance(annotation, tuple): 
    6464            return annotation 
    65         return tuple(annotation[v] if types[v] == None else types[v](annotation[v])  
    66             for v in other_relevant) 
     65        return tuple(types[v](annotation[v]) for v in other_relevant) 
    6766 
    6867    other_relevant_d2 = defaultdict(int) #"multiset" - number 
     
    154153    return newattr 
    155154     
    156 def missing_name_gen(): 
     155def name_gen(a): 
    157156    i = 1 
    158157    while True: 
    159         yield "missing {0}".format(i) 
     158        yield a + " {0}".format(i) 
    160159        i += 1 
    161160         
    162 missing_name_gen = missing_name_gen() 
     161missing_name_gen = name_gen("!!missing") 
     162inactive_name_gen = name_gen("!!inactive") 
     163 
    163164 
    164165class MyHeaderView(QHeaderView): 
     
    340341        def select(model, selection_model, selected_items): 
    341342            all_items = list(model) 
    342             indices = [all_items.index(item) for item in selected_items] 
     343            try: 
     344                indices = [all_items.index(item) for item in selected_items] 
     345            except: 
     346                indices = [] 
    343347            for ind in indices: 
    344348                selection_model.select(model.index(ind), QItemSelectionModel.Select) 
     
    393397        if not separate_keys: 
    394398            self.warning(0, "No separate by attribute selected.") 
     399 
    395400        partitions = separate_by(self.data, separate_keys, consider=relevant_keys).items() 
    396401 
     402        all_values = defaultdict(set) 
     403        for a in [ at.attributes for at in self.data.domain.attributes ]: 
     404            for k,v in a.iteritems(): 
     405                all_values[k].add(v) 
     406 
     407        #sort groups 
    397408        pkeys = [ key for key,_ in partitions ] 
    398409        types = [ data_type([a[i] for a in pkeys]) for i in range(len(pkeys[0])) ] 
    399410 
    400411        partitions = sorted(partitions, key=lambda x: 
    401                     tuple(v if types[i] == None else types[i](v) 
    402                     for i,v in enumerate(x[0]))) 
     412                    tuple(types[i](v) for i,v in enumerate(x[0]))) 
    403413 
    404414        split_groups = [] 
    405415         
    406416        # Collect relevant key value pairs for all columns 
    407         relevant_items = {} 
     417        relevant_items = None 
     418 
    408419        for keys, indices in partitions: 
     420            if relevant_items == None: 
     421                relevant_items = [ defaultdict(set) for _ in range(len(indices)) ] 
    409422            for i, ind in enumerate(indices): 
    410423                if ind is not None: 
    411424                    attr = self.data.domain[ind] 
    412                     relevant_items[i] = [(key, attr.attributes[key]) \ 
    413                                          for key in relevant_keys] 
    414                      
     425                    for key in relevant_keys: 
     426                        relevant_items[i][key].add(attr.attributes[key]) 
     427 
     428        #those with different values between rows are not relevant 
     429        for d in relevant_items: 
     430            for k,s in d.items(): 
     431                if len(s) > 1: 
     432                    del d[k] 
     433                else: 
     434                    d[k] = s.pop() 
     435 
    415436        def get_attr(attr_index, i): 
    416437            if attr_index is None: 
    417438                attr = Orange.data.variable.Continuous(missing_name_gen.next()) 
    418                 attr.attributes.update(relevant_items.get(i, [])) 
     439                attr.attributes.update(relevant_items[i]) 
    419440                return attr 
    420441            else: 
     
    430451            split_groups.append((keys, domain)) 
    431452             
    432         self.set_groups(separate_keys, split_groups, relevant_keys) 
     453        self.set_groups(separate_keys, split_groups, relevant_keys, relevant_items, all_values) 
    433454         
    434455        self.partitions = partitions 
     
    438459#        self.update_distances(separate_keys, partitions, self.data) 
    439460         
    440     def set_groups(self, keys, groups, relevant_keys): 
     461    def set_groups(self, keys, groups, relevant_keys, relevant_items, all_values): 
    441462        """ Set the current data groups and update the Group widget 
    442463        """ 
     
    445466        header_views = [] 
    446467        palette = self.palette() 
    447         for ann_vals, domain in groups: 
    448             label = QLabel(" <b>|</b> ".join(["<b>{0}</ b> = {1}".format(key,val) \ 
    449                                      for key, val in zip(keys, ann_vals)])) 
     468        all_values = all_values.keys() 
     469 
     470        def for_print(rd): 
     471            attrs = [] 
     472            for d in rd: 
     473                attr = Orange.data.variable.Continuous(inactive_name_gen.next()) 
     474                attr.attributes.update(d) 
     475                attrs.append(attr) 
     476            return Orange.data.Domain(attrs, None) 
     477 
     478        for ann_vals, domain in [ (None, for_print(relevant_items)) ] + groups: 
     479            label = None 
     480            if ann_vals != None: 
     481                ann_vals = " <b>|</b> ".join(["<b>{0}</ b> = {1}".format(key,val) \ 
     482                     for key, val in zip(keys, ann_vals)]) 
     483                label = QLabel(ann_vals) 
    450484             
    451485            model = QStandardItemModel() 
    452486            for i, attr in enumerate(domain.attributes): 
    453487                item = QStandardItem() 
    454                 if not str(attr.name).startswith("missing "): ## TODO: Change this to not depend on name 
     488                if str(attr.name).startswith("!!missing "): ## TODO: Change this to not depend on name 
    455489                    header_text = ["{0}={1}".format(key, attr.attributes.get(key, "?")) \ 
    456                                    for key in relevant_keys] 
    457                     header_text = "\n".join(header_text) 
    458                     item.setData(QVariant(header_text), Qt.DisplayRole) 
    459                     item.setData(QVariant(attr.name), Qt.ToolTipRole) 
    460                      
    461                 else: 
    462                     header_text = ["{0}={1}".format(key, attr.attributes.get(key, "?")) \ 
    463                                    for key in relevant_keys] 
     490                                   for key in all_values if key not in relevant_items[i]] 
    464491                    header_text = "\n".join(header_text) 
    465492                    item.setData(QVariant(header_text), Qt.DisplayRole) 
     
    468495                    item.setData(QVariant(palette.color(QPalette.Disabled, QPalette.Window)), Qt.BackgroundRole) 
    469496                    item.setData(QVariant("Missing feature."), Qt.ToolTipRole) 
    470                  
     497                elif str(attr.name).startswith("!!inactive "): 
     498                    header_text = ["{0}={1}".format(key, attr.attributes.get(key, "?")) \ 
     499                                   for key in all_values if key in relevant_items[i]] 
     500                    header_text = "\n".join(header_text) 
     501                    item.setData(QVariant(header_text), Qt.DisplayRole) 
     502                    item.setData(QVariant(palette.color(QPalette.Disabled, QPalette.Window)), Qt.BackgroundRole) 
     503                else: 
     504                    header_text = ["{0}={1}".format(key, attr.attributes.get(key, "?")) \ 
     505                                   for key in all_values if key not in relevant_items[i]] 
     506                    header_text = "\n".join(header_text) 
     507                    item.setData(QVariant(header_text), Qt.DisplayRole) 
     508                    item.setData(QVariant(attr.name), Qt.ToolTipRole) 
     509                     
    471510                model.setHorizontalHeaderItem(i, item) 
    472511            attr_count = len(domain.attributes) 
     
    481520            header_views.append(view) 
    482521             
    483             layout.addWidget(label) 
     522            if label: 
     523                layout.addWidget(label) 
    484524            layout.addWidget(view) 
    485525            layout.addSpacing(8) 
     
    580620    w = OWGenotypeDistances() 
    581621#    data = Orange.data.Table(os.path.expanduser("~/Documents/dicty-express-sample.tab")) 
    582     data = Orange.data.Table(os.path.expanduser("~/Downloads/tmp.tab")) 
     622#    data = Orange.data.Table(os.path.expanduser("~/Downloads/tmp.tab")) 
     623    data = Orange.data.Table(os.path.expanduser("~/tgr.tab")) 
    583624    w.set_data(data) 
    584625    w.show() 
Note: See TracChangeset for help on using the changeset viewer.