Changeset 1944:91a972497fcc in orange-bioinformatics


Ignore:
Timestamp:
01/06/14 14:55:25 (3 months ago)
Author:
markotoplak
Branch:
default
Message:

GEO datasets: when outputting samples as rows and there a multiple types, all types become meta attributes and the only selected type becomes the class.

Location:
orangecontrib/bio
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orangecontrib/bio/obiGEO.py

    r1938 r1944  
    77 
    88from . import obiData, obiTaxonomy 
     9from collections import defaultdict 
     10import Orange 
    911 
    1012def spots_mean(x): 
     
    1214    if len(vs) == 0: return "?" 
    1315    return sum(vs)/len(vs) 
     16 
    1417def spots_median(x): 
    1518    vs = [v for v in x if v and v<>"?"] 
     
    2124        return (z[len(vs)/2-1] + z[len(vs)/2]) / 2.  
    2225    return sum(vs)/len(vs) 
     26 
    2327def spots_min(x): 
    2428    vs = [v for v in x if v and v<>"?"] 
    2529    if len(vs) == 0: return "?" 
    2630    return min(vs)/len(vs) 
     31 
    2732def spots_max(x): 
    2833    vs = [v for v in x if v and v<>"?"] 
     
    205210        annotation = {} 
    206211        for info in self.info["subsets"]: 
    207             if sample_type and info["type"]<>sample_type: 
    208                 continue 
    209             for id in info["sample_id"]: 
    210                 annotation.setdefault(id, {})[info["type"]]=info["description"] 
     212            if not sample_type or info["type"] == sample_type: 
     213                for id in info["sample_id"]: 
     214                    annotation.setdefault(id, {})[info["type"]]=info["description"] 
    211215        return annotation 
    212216 
     
    214218        """Return class values for GDS samples.""" 
    215219        annotations = self.sample_annotations(sample_type) 
    216         return dict([(sample, "|".join([a for t,a in ann.items()])) for sample, ann in annotations.items()]) 
     220        return dict([(sample, "|".join([a for t,a in sorted(ann.items())])) for sample, ann in annotations.items()]) 
    217221         
    218222    def sample_types(self): 
     
    252256            if None in cvalues: 
    253257                cvalues.remove(None) 
     258 
     259            samp_ann = self.sample_annotations() 
     260 
     261            ad = defaultdict(set) 
     262            for d in samp_ann.values(): 
     263                for n,v in d.items(): 
     264                    ad[n].add(v) 
     265 
     266            #select sample type if there is only one 
     267            if len(ad) == 1:  
     268                sample_type = ad.keys()[0] 
     269 
    254270            classvar = orange.EnumVariable(name=sample_type or "class", values=cvalues) 
    255             if report_genes: # save by genes 
    256                 atts = [orange.FloatVariable(name=gene) for gene in self.gene2spots.keys()] 
    257                 domain = orange.Domain(atts, classvar) 
    258                 for (i, sampleid) in enumerate(self.info["samples"]): 
    259                     vals = [merge_function([self.gdsdata[spot].data[i] \ 
    260                             for spot in self.gene2spots[gene]]) for gene in self.gene2spots.keys()] 
    261                     orng_data.append(vals + [sample2class[sampleid]]) 
    262                  
    263             else: # save by spots 
    264                 spots = self.spot2gene.keys() 
    265                 atts = [orange.FloatVariable(name=id) for id in spots] 
    266                 domain = orange.Domain(atts, classvar) 
    267                 for (i, sampleid) in enumerate(self.info["samples"]): 
    268                     orng_data.append([self.gdsdata[spot].data[i] for spot in spots] + [sample2class[sampleid]]) 
     271            spots = self.gene2spots.keys() if report_genes else self.spot2gene.keys() 
     272            atts = [orange.FloatVariable(name=gene) for gene in spots] 
     273 
     274            domain = orange.Domain(atts, classvar) 
     275 
     276            #meta attributes for sample types 
     277            mid = {} 
     278            for n,values in ad.items(): 
     279                if n != sample_type: 
     280                    mid[n] = orange.newmetaid() 
     281                    domain.addmeta(mid[n], orange.EnumVariable(name=n, values=list(values))) 
     282 
     283            for (i, sampleid) in enumerate(self.info["samples"]): 
     284                vals = [ ( (merge_function([self.gdsdata[spot].data[i] for spot in self.gene2spots[gene]]) ) 
     285                         if report_genes else self.gdsdata[gene].data[i] )  
     286                         for gene in spots ] 
     287                instance = Orange.data.Instance(domain, vals + [sample2class[sampleid]]) 
     288                for n, v in samp_ann[sampleid].items(): 
     289                    if n != sample_type: 
     290                        instance[mid[n]] = v 
     291                orng_data.append(instance) 
     292 
    269293            if missing_class_value == None: 
    270                 orng_data = [example for example in orng_data if example[-1] != None] 
     294                orng_data = [example for example in orng_data if example[-1].value != '?'] 
    271295     
    272296            return orange.ExampleTable(domain, orng_data) 
  • orangecontrib/bio/widgets/OWGEODatasets.py

    r1888 r1944  
    447447        samples = [] 
    448448        unused_types = [] 
     449        used_types = [] 
    449450        for stype in childiter(self.annotationsTree.invisibleRootItem()):  
    450451            selected_values = [] 
     
    457458            if selected_values: 
    458459                samples.extend(selected_values) 
     460                used_types.append(str(stype.text(0))) 
    459461            else: 
    460462                # If no sample of sample type is selected we don't filter on it. 
    461463                samples.extend(all_values) 
    462464                unused_types.append(str(stype.text(0))) 
    463                  
    464         return samples 
     465         
     466        return samples, used_types 
    465467     
    466468    def commitIf(self): 
     
    482484                return data 
    483485             
     486            _, groups = self.selectedSamples() 
     487            if len(groups) == 1 and self.outputRows: 
     488                sample_type = groups[0] 
     489 
    484490            self.setEnabled(False) 
    485491            call = self.asyncCall(getdata, (self.currentGds["dataset_id"],), dict(report_genes=self.mergeSpots, 
    486492                                           transpose=self.outputRows, 
    487                                            sample_type=sample_type if sample_type!="Include all" else None), 
     493                                           sample_type=sample_type), 
    488494                                  onResult=self.onData, 
    489495                                  onFinished=lambda: self.setEnabled(True), 
     
    507513        self.progressBarSet(50) 
    508514         
    509         samples = self.selectedSamples() 
     515        samples,_ = self.selectedSamples() 
    510516         
    511517        self.warning(0) 
    512518        message = None 
    513519        if self.outputRows: 
    514             samples = set(s[1] for s in samples) # dont have info on sample types in the data class variable 
    515             select = [1 if samples.issuperset(str(ex.getclass()).split("|")) else 0 for ex in data] 
     520            def samplesinst(ex): 
     521                out = [] 
     522                for i,a in data.domain.get_metas().items(): 
     523                    out.append((a.name, ex[i].value)) 
     524                if data.domain.class_var.name != 'class': 
     525                    out.append((data.domain.class_var.name, ex[-1].value)) 
     526                return out 
     527            samples = set(samples) 
     528 
     529            select = [1 if samples.issuperset(samplesinst(ex)) else 0 for ex in data] 
    516530            data = data.select(select) 
    517             # TODO: add sample types as separate features   
    518             data.domain.classVar.values = ["|".join([cl for cl in val.split("|") if cl in samples]) for val in data.domain.classVar.values] 
    519531            if len(data) == 0: 
    520532                message = "No samples with selected sample annotations." 
Note: See TracChangeset for help on using the changeset viewer.