def draw_matches(self, sp, chrom, start, end, drawn=None): vis = [] if drawn is None: drawn = set() # build list of matches in order of drawing for gene in iter_chrom(self.db.get_regions(sp, chrom), start, end): # need to sort matches by genome order so that mult-genome synteny # is drawn top-down # get orthologs genes2 = [x for x in self.orth_lookup.get(gene.data["ID"], []) if x in self.region_layout] if len(genes2) == 0: continue rows = util.groupby(lambda x: self.region_layout[x].y, genes2) keys = util.sort(rows.keys(), reverse=True) rows = util.mget(rows, keys) l = self.region_layout for i in range(1, len(rows)): for botGene in rows[i]: gene1 = self.db.get_region(botGene) for topGene in rows[i-1]: if (botGene, topGene) in drawn: continue drawn.add((botGene, topGene)) gene2 = self.db.get_region(topGene) y1 = l[topGene].y y2 = l[botGene].y + 1 x1 = l[topGene].x x2 = l[topGene].x + gene2.length() x3 = l[botGene].x + gene1.length() x4 = l[botGene].x if self.fat_matches: vis.append(quads( self.colors["matches"], x1, y1, x2, y1, x3, y2, x4, y2)) vis.append(lines(self.colors["matches"], x1, y1, x4, y2)) return group(* vis)
def layout_frag_contents(self, frag): """Layout the contents of a fragment""" for gene in iter_chrom(self.db.get_regions(frag.genome, frag.chrom), frag.start, frag.end): if frag.direction == 1: x = frag.x + gene.start - frag.start else: x = frag.x + frag.end - gene.end self.region_layout[gene.data["ID"]] = Layout(x, frag.y, frag.direction) self.region2frags[gene.data["ID"]] = frag
def layout_frag_contents(self, frag): """Layout the contents of a fragment""" for gene in iter_chrom(self.db.get_regions(frag.genome, frag.chrom), frag.start, frag.end): if frag.direction == 1: x = frag.x + gene.start - frag.start else: x = frag.x + frag.end - gene.end self.region_layout[gene.data["ID"]] = Layout( x, frag.y, frag.direction) self.region2frags[gene.data["ID"]] = frag
def draw_matches(self, sp, chrom, start, end, drawn=None): vis = [] if drawn is None: drawn = set() # build list of matches in order of drawing for gene in iter_chrom(self.db.get_regions(sp, chrom), start, end): # need to sort matches by genome order so that mult-genome synteny # is drawn top-down # get orthologs genes2 = [ x for x in self.orth_lookup.get(gene.data["ID"], []) if x in self.region_layout ] if len(genes2) == 0: continue rows = util.groupby(lambda x: self.region_layout[x].y, genes2) keys = util.sort(rows.keys(), reverse=True) rows = util.mget(rows, keys) l = self.region_layout for i in range(1, len(rows)): for botGene in rows[i]: gene1 = self.db.get_region(botGene) for topGene in rows[i - 1]: if (botGene, topGene) in drawn: continue drawn.add((botGene, topGene)) gene2 = self.db.get_region(topGene) y1 = l[topGene].y y2 = l[botGene].y + 1 x1 = l[topGene].x x2 = l[topGene].x + gene2.length() x3 = l[botGene].x + gene1.length() x4 = l[botGene].x if self.fat_matches: vis.append( quads(self.colors["matches"], x1, y1, x2, y1, x3, y2, x4, y2)) vis.append( lines(self.colors["matches"], x1, y1, x4, y2)) return group(*vis)
def layout_frags(self, genome_name, chrom_name, start, end, direction=1): ref_chrom = self.chroms_lookup[(genome_name, chrom_name)] # setup genome display order order = {} for i, genome in enumerate(self.genomes): order[genome] = i # swap the genome with order 0 and the reference genome j = order[self.ref_genome] order[self.genomes[0]] = j order[self.ref_genome] = 0 # init reference fragment ref_frag = Frag(genome=genome_name, chrom=chrom_name, start=max(start, 0), end=min(end, ref_chrom.end), strand=direction, x=max(start,0), y=0) self.frags.add(ref_frag) self.layout_frag_contents(ref_frag) # find all synteny blocks in this region # sort blocks by appearance in ref_chrom blocks = list(self.filter_blocks(self.blocks, ref_chrom, start, end)) def blocksort(a): if a[1] == 0: starta = a[0].region1.start else: starta = a[0].region2.start blocks.sort(key=blocksort) # make lookup for genes to block and block to fragment block_lookup = {} frag_lookup = {} for block, flip in blocks: if flip == 0: other = block.region2 else: other = block.region1 frag = Frag() frag.genome = other.species frag.chrom = other.seqname frag_lookup[block] = frag for gene2 in iter_chrom(self.db.get_regions(frag.genome, frag.chrom), other.start, other.end): block_lookup[gene2] = block self.block_lookup = block_lookup # find all genes that will be drawn # walk along ref_chrom and store drawn genes into fragments refLookup = {} for gene in iter_chrom(self.db.get_regions(genome_name, chrom_name), start, end): for name2 in self.orth_lookup.get(gene.data["ID"], []): gene2 = self.db.get_region(name2) if gene2 in block_lookup: frag_lookup[block_lookup[gene2]].genes.append(gene2) refLookup[gene2] = gene self.refLookup = refLookup # determine fragment dimensions for frag in frag_lookup.itervalues(): if len(frag.genes) == 0: frag.x = None continue frag.genes.sort(key=lambda a: a.start) # set fragment start and end frag.start = frag.genes[0].start frag.end = frag.genes[-1].end # find fragment direction vote = 0 last = None for gene2 in frag.genes: pos = refLookup[gene2].start if last != None and pos != last: if last < pos: vote += 1 else: vote -= 1 last = pos if vote > 0: frag.direction = direction else: frag.direction = -direction # find fragment x-coordinate diffs = [] for gene2 in frag.genes: if direction == 1: offset1 = refLookup[gene2].start - ref_frag.start else: offset1 = ref_frag.end - refLookup[gene2].end if frag.direction == 1: offset2 = gene2.start - frag.start else: offset2 = frag.end - gene2.end diffs.append(offset2 - offset1) frag.x = ref_frag.x - stats.median(diffs) # place blocks fragY = util.Dict(default=-self.genome_sep) for block, flip in blocks: frag = frag_lookup[block] otherGenome = frag.genome if frag.x == None: # fragment could not be placed continue frag.y = fragY[otherGenome] - \ ((order[otherGenome] - 1) * self.max_genome_sep) # re-get all genes between those coordinates #frag.genes = list(iter_chrom(self.db.get_regions(frag.genome, # frag.chrom), # frag.start, frag.end)) # store and lyaout frag self.frags.add(frag) self.layout_frag_contents(frag) # stagger fragments fragY[otherGenome] -= self.frag_sep if fragY[otherGenome] < -self.max_genome_sep: fragY[otherGenome] = -self.genome_sep
def layout_frags(self, genome_name, chrom_name, start, end, direction=1): ref_chrom = self.chroms_lookup[(genome_name, chrom_name)] # setup genome display order order = {} for i, genome in enumerate(self.genomes): order[genome] = i # swap the genome with order 0 and the reference genome j = order[self.ref_genome] order[self.genomes[0]] = j order[self.ref_genome] = 0 # init reference fragment ref_frag = Frag(genome=genome_name, chrom=chrom_name, start=max(start, 0), end=min(end, ref_chrom.end), strand=direction, x=max(start, 0), y=0) self.frags.add(ref_frag) self.layout_frag_contents(ref_frag) # find all synteny blocks in this region # sort blocks by appearance in ref_chrom blocks = list(self.filter_blocks(self.blocks, ref_chrom, start, end)) def blocksort(a): if a[1] == 0: starta = a[0].region1.start else: starta = a[0].region2.start blocks.sort(key=blocksort) # make lookup for genes to block and block to fragment block_lookup = {} frag_lookup = {} for block, flip in blocks: if flip == 0: other = block.region2 else: other = block.region1 frag = Frag() frag.genome = other.species frag.chrom = other.seqname frag_lookup[block] = frag for gene2 in iter_chrom( self.db.get_regions(frag.genome, frag.chrom), other.start, other.end): block_lookup[gene2] = block self.block_lookup = block_lookup # find all genes that will be drawn # walk along ref_chrom and store drawn genes into fragments refLookup = {} for gene in iter_chrom(self.db.get_regions(genome_name, chrom_name), start, end): for name2 in self.orth_lookup.get(gene.data["ID"], []): gene2 = self.db.get_region(name2) if gene2 in block_lookup: frag_lookup[block_lookup[gene2]].genes.append(gene2) refLookup[gene2] = gene self.refLookup = refLookup # determine fragment dimensions for frag in frag_lookup.itervalues(): if len(frag.genes) == 0: frag.x = None continue frag.genes.sort(key=lambda a: a.start) # set fragment start and end frag.start = frag.genes[0].start frag.end = frag.genes[-1].end # find fragment direction vote = 0 last = None for gene2 in frag.genes: pos = refLookup[gene2].start if last != None and pos != last: if last < pos: vote += 1 else: vote -= 1 last = pos if vote > 0: frag.direction = direction else: frag.direction = -direction # find fragment x-coordinate diffs = [] for gene2 in frag.genes: if direction == 1: offset1 = refLookup[gene2].start - ref_frag.start else: offset1 = ref_frag.end - refLookup[gene2].end if frag.direction == 1: offset2 = gene2.start - frag.start else: offset2 = frag.end - gene2.end diffs.append(offset2 - offset1) frag.x = ref_frag.x - stats.median(diffs) # place blocks fragY = util.Dict(default=-self.genome_sep) for block, flip in blocks: frag = frag_lookup[block] otherGenome = frag.genome if frag.x == None: # fragment could not be placed continue frag.y = fragY[otherGenome] - \ ((order[otherGenome] - 1) * self.max_genome_sep) # re-get all genes between those coordinates #frag.genes = list(iter_chrom(self.db.get_regions(frag.genome, # frag.chrom), # frag.start, frag.end)) # store and lyaout frag self.frags.add(frag) self.layout_frag_contents(frag) # stagger fragments fragY[otherGenome] -= self.frag_sep if fragY[otherGenome] < -self.max_genome_sep: fragY[otherGenome] = -self.genome_sep