Changeset 1363:fce72b19ca69 in orange-bioinformatics


Ignore:
Timestamp:
04/08/11 17:42:37 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
ae50e2437fee8a5d0ba8066d403c5a9d0bb282f9
Message:

Compute the distance matrix and send it on output signal.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • widgets/prototypes/OWGenotypeDistances.py

    r1362 r1363  
    144144    contextHandlers = {"": KeyValueContextHandler("")} 
    145145    settingsList = [] 
     146     
     147    DISTANCE_FUNCTIONS = [("Euclidean distance", dist_eucl), 
     148                          ("Pearson correlation", dist_pcorr)] 
     149     
    146150    def __init__(self, parent=None, signalManager=None, title="Genotype Distances"): 
    147151        OWWidget.__init__(self, parent, signalManager, title) 
     
    149153        self.inputs = [("Example Table", ExampleTable, self.set_data)] 
    150154        self.outputs = [("Distances", Orange.core.SymMatrix)] 
     155         
     156        self.distance_measure = 0 
    151157         
    152158        self.loadSettings() 
     
    158164        self.info_box = OWGUI.widgetLabel(OWGUI.widgetBox(self.controlArea, "Info", 
    159165                                                         addSpace=True), 
    160                                          "No data on input") 
     166                                         "No data on input\n\n") 
    161167         
    162168        box = OWGUI.widgetBox(self.controlArea, "Separate By", 
     
    175181         
    176182        self.distance_view = OWGUI.comboBox(self.controlArea, self, "distance_measure", 
    177                                             box="Distance Measure") 
     183                                            box="Distance Measure", 
     184                                            items=[d[0] for d in self.DISTANCE_FUNCTIONS]) 
     185         
    178186        self.groups_box = OWGUI.widgetBox(self.mainArea, "Groups") 
    179187        self.groups_scroll_area = QScrollArea() 
     
    195203        self.data = data 
    196204        if data: 
     205            self.info_box.setText("Table with:\n {0} instances\nand\n {1} features".format(len(data), len(data.domain))) 
    197206            self.update_control() 
    198207            self.split_data() 
     208        else: 
     209            self.info_box.setText("No data on input.\n\n") 
    199210             
    200211    def update_control(self): 
     
    202213        views with keys from attribute labels. 
    203214        """ 
    204         attrs = [attr.attributes.items() for attr in data.domain.attributes] 
     215        attrs = [attr.attributes.items() for attr in self.data.domain.attributes] 
    205216        attrs = reduce(set.union, attrs, set()) 
    206217        values = defaultdict(set) 
     
    282293        if not separate_keys: 
    283294            return 
    284         ann = separate_by(self.data, separate_keys, consider=relevant_keys) 
    285         print ann 
     295        partitions = separate_by(self.data, separate_keys, consider=relevant_keys).items() 
     296        print partitions 
    286297         
    287298        split_data = [] 
     
    289300        # Collect relevant key value pairs for all columns 
    290301        relevant_items = {} 
    291         for keys, indices in sorted(ann.items()): 
     302        for keys, indices in sorted(partitions): 
    292303            for i, ind in enumerate(indices): 
    293304                if ind is not None: 
     
    304315                return self.data.domain[attr_index] 
    305316             
    306         for keys, indices in sorted(ann.items()): 
     317        for keys, indices in sorted(partitions): 
    307318            attrs = [get_attr(attr_index, i) for i, attr_index in enumerate(indices)] 
    308319            domain = Orange.data.Domain(attrs, None) 
     
    311322             
    312323        self.set_groups(separate_keys, split_data, relevant_keys) 
     324         
     325        self.update_distances(separate_keys, partitions, self.data) 
    313326         
    314327    def set_groups(self, keys, groups, relevant_keys): 
     
    320333        palette = self.palette() 
    321334        for ann_vals, table in groups: 
    322             label = QLabel(" <b>|</b> ".join(["<b>{0}</b> = {1}".format(key,val) \ 
     335            label = QLabel(" <b>|</b> ".join(["<b>{0}</ b> = {1}".format(key,val) \ 
    323336                                     for key, val in zip(keys, ann_vals)])) 
    324337             
     
    388401        self.groups_scroll_area.setWidget(widget) 
    389402         
    390         #Compute distances here 
    391          
    392 data = Orange.data.Table("tmp.tab") 
    393 partitions = separate_by(data, [ "genotype" ], consider=["tp", "replicate"]).items() 
    394 print partitions 
    395 l1 = linearize(data, partitions[0][1]) 
    396 l2 = linearize(data, partitions[1][1]) 
    397 print  dist_eucl(l1, l2) 
    398 print  dist_pcorr(l1, l2) 
    399  
    400  
    401 if __name__ == "__main1__": 
     403    def update_distances(self, separate_keys, partitions, data): 
     404        """ Compute the distances between genotypes. 
     405        """ 
     406        matrix = Orange.core.SymMatrix(len(partitions)) 
     407        profiles = [linearize(data, indices) for _, indices in partitions] 
     408        dist_func = self.DISTANCE_FUNCTIONS[self.distance_measure][1] 
     409        from Orange.misc import progressBarMilestones 
     410        count = (len(profiles) * len(profiles) - 1) / 2 
     411        milestones = progressBarMilestones(count) 
     412        iter_count = 0 
     413        self.progressBarInit() 
     414        for i in range(len(profiles)): 
     415            for j in range(i + 1, len(profiles)): 
     416                matrix[i, j] = dist_func(profiles[i], profiles[j]) 
     417                iter_count += 1 
     418                if iter_count in milestones: 
     419                    self.progressBarSet(100.0 * iter_count / count) 
     420        self.progressBarFinished() 
     421         
     422        items = [["{0}={1}".format(key, value) for key, value in zip(separate_keys, values)] \ 
     423                  for values, _ in partitions] 
     424        items = [" | ".join(item) for item in items] 
     425        matrix.items = items 
     426         
     427        self.send("Distances", matrix) 
     428     
     429 
     430if __name__ == "__main__": 
    402431    import os, sys 
    403432    app = QApplication(sys.argv ) 
     
    410439    w.saveSettings() 
    411440     
    412  
     441#    data = Orange.data.Table("tmp.tab") 
     442#    partitions = separate_by(data, [ "genotype" ], consider=["tp", "replicate"]).items() 
     443#    print partitions 
     444#    l1 = linearize(data, partitions[0][1]) 
     445#    l2 = linearize(data, partitions[1][1]) 
     446#    print  dist_eucl(l1, l2) 
     447#    print  dist_pcorr(l1, l2) 
     448 
     449     
     450 
Note: See TracChangeset for help on using the changeset viewer.