def ilmat2imat(ilmat, rowlabels, collabels): """ Converts labeled matrix iterator (ilmat) to indexed matrix iterator (imat) """ rowlookup = util.list2lookup(rowlabels) collookup = util.list2lookup(collabels) for r, c, v in ilmat: yield rowlookup[r], collookup[c], v
def renameTreeAlign(tree, align): """Rename the ancestral nodes of a tree""" # rename leaves for leaf in tree.leaves(): tree.rename(leaf.name, align.keys()[int(leaf.name) - 1]) names = align.keys() name_lookup = util.list2lookup(names) lookup = dict(align) align.clear() order = {} # rename ancestral nodes by preorder next = [1] def walk(node): oldname = node.name if not node.is_leaf(): tree.rename(node.name, next[0]) next[0] += 1 align[str(node.name)] = lookup[str(oldname)] order[str(node.name)] = name_lookup[str(oldname)] else: align[node.name] = lookup[node.name] order[node.name] = name_lookup[node.name] for child in node.children: walk(child) walk(tree.root) align.names.sort(key=lambda x: order[x])
def map(self, func, headers=None): """Returns a new table with each row mapped by function 'func'""" if len(self) == 0: # handle case of zero length table return self.new() # determine what table will look like from first row first_row = func(self[0]) # determine headers of new table if headers is None: # try order new headers the same way as old headers headers = first_row.keys() lookup = util.list2lookup(self.headers) top = len(headers) headers.sort(key=lambda x: (lookup.get(x, top), x)) tab = type(self)(itertools.chain([first_row], (func(x) for x in self[1:])), headers=headers) tab.delim = self.delim tab.nheaders = self.nheaders return tab
def rename_tree_with_ids(tree, labels): lookup = util.list2lookup(labels) names = tree.nodes.keys() for name in names: if tree.nodes[name].is_leaf(): tree.rename(name, phylip_padding(str(lookup[name])))
def map(self, func, headers=None): """Returns a new table with each row mapped by function 'func'""" if len(self) == 0: # handle case of zero length table return self.new() # determine what table will look like from first row first_row = func(self[0]) # determine headers of new table if headers is None: # try order new headers the same way as old headers headers = first_row.keys() lookup = util.list2lookup(self.headers) top = len(headers) headers.sort(key=lambda x: (lookup.get(x, top), x)) tab = type(self)( itertools.chain([first_row], (func(x) for x in self[1:])), headers=headers) tab.delim = self.delim tab.nheaders = self.nheaders return tab
def renameTreeAlign(tree, align): """Rename the ancestral nodes of a tree""" # rename leaves for leaf in tree.leaves(): tree.rename(leaf.name, align.keys()[int(leaf.name)-1]) names = align.keys() name_lookup = util.list2lookup(names) lookup = dict(align) align.clear() order = {} # rename ancestral nodes by preorder next = [1] def walk(node): oldname = node.name if not node.is_leaf(): tree.rename(node.name, next[0]) next[0] += 1 align[str(node.name)] = lookup[str(oldname)] order[str(node.name)] = name_lookup[str(oldname)] else: align[node.name] = lookup[node.name] order[node.name] = name_lookup[node.name] for child in node.children: walk(child) walk(tree.root) align.names.sort(key=lambda x: order[x])
def parts2partids(parts, labels): lookup = util.list2lookup(labels) partids = [0] * len(labels) for i in xrange(len(parts)): for item in parts[i]: partids[lookup[item]] = i return partids
def init_distmats(self): """Initialize distance matrices Initialization should by done after trees and alignments """ if len(self.distmats) > 0: self.matrices = [] # setup matrices for i, distmat in enumerate(self.distmats): # convert distmatrix to summon Matrix if isinstance(distmat, matrix.Matrix): mat = distmat else: mat = matrix.Matrix() mat.from2DList(distmat) # set default colormap if mat.colormap == None: mat.colormap = self.matrix_colormap # determine labels if self.dist_labels_from_align and self.align_order != None: # determine row/col labels from alignment if it exists mat.rowlabels = self.align_order mat.collabels = self.align_order elif self.distlabels != None: mat.rowlabels = self.distlabels[i] mat.collabels = self.distlabels[i] else: raise Exception("no labels given for matrix") # reorder according to any given tree if self.order != None: lookup = util.list2lookup(mat.rowlabels) mat.rperm = util.mget(lookup, self.order) mat.cperm = util.mget(lookup, self.order) mat.setup() self.matrices.append(mat) if self.seqs == None: seqs = self.current_align else: seqs = self.seqs # create matrix vis self.current_matrix = self.matrices[0] self.visdist = distmatrixvis.DistMatrixViewer(self.current_matrix, seqs=seqs, bgcolor=(1, 1, 1)) else: self.visdist = None
def init_distmats(self): """Initialize distance matrices Initialization should by done after trees and alignments """ if len(self.distmats) > 0: self.matrices = [] # setup matrices for i, distmat in enumerate(self.distmats): # convert distmatrix to summon Matrix if isinstance(distmat, matrix.Matrix): mat = distmat else: mat = matrix.Matrix() mat.from2DList(distmat) # set default colormap if mat.colormap == None: mat.colormap = self.matrix_colormap # determine labels if self.dist_labels_from_align and self.align_order != None: # determine row/col labels from alignment if it exists mat.rowlabels = self.align_order mat.collabels = self.align_order elif self.distlabels != None: mat.rowlabels = self.distlabels[i] mat.collabels = self.distlabels[i] else: raise Exception("no labels given for matrix") # reorder according to any given tree if self.order != None: lookup = util.list2lookup(mat.rowlabels) mat.rperm = util.mget(lookup, self.order) mat.cperm = util.mget(lookup, self.order) mat.setup() self.matrices.append(mat) if self.seqs == None: seqs = self.current_align else: seqs = self.seqs # create matrix vis self.current_matrix = self.matrices[0] self.visdist = distmatrixvis.DistMatrixViewer(self.current_matrix, seqs=seqs, bgcolor=(1,1,1)) else: self.visdist = None
def show_selection(self): # sort genes by order in matrix genes = list(self.selgenes) lookup = util.list2lookup(self.mat.rowlabels) genes.sort(key=lambda x: lookup[x]) print print "selected genes:" for i, gene in enumerate(genes): print "%3d %s" % (i+1, gene)
def show_selection(self): # sort genes by order in matrix genes = list(self.selgenes) lookup = util.list2lookup(self.mat.rowlabels) genes.sort(key=lambda x: lookup[x]) print print "selected genes:" for i, gene in enumerate(genes): print "%3d %s" % (i + 1, gene)
def splitString(split, leaves=None, leafDelim=" ", splitDelim="|"): """ Returns a string representing a split If leaves are specified, leaf names will be displayed in that order. """ if leaves is not None: lookup = util.list2lookup(leaves) split = (sorted(split[0], key=lambda x: lookup[x]), sorted(split[0], key=lambda x: lookup[x])) return leafDelim.join(split[0]) + splitDelim + leafDelim.join(split[1])
def on_reorder_leaves(self): leaves = self.current_tree.leaf_names() # reorder matrix for mat in self.matrices: lookup = util.list2lookup(mat.rowlabels) mat.rperm = util.mget(lookup, leaves) mat.cperm = util.mget(lookup, leaves) mat.setup() if self.visdist: self.visdist.redraw() # reorder alignment for aln in self.aligns: aln.names = leaves if self.visalign: self.visalign.show()
def show_align(self): if self.seqs == None: print "cannot build alignment: no sequences are loaded" return if len(self.selgenes) == 0: print "cannot build alignment: no sequences selected" return genes = list(self.selgenes) lookup = util.list2lookup(self.mat.rowlabels) self.aln = muscle.muscle(self.seqs.get(genes)) self.aln.names.sort(key=lambda x: lookup[x]) self.visaln = genomebrowser.show_align(self.aln) self.visaln.win.set_name("alignment")
def show_align(self): if self.seqs is None: print "cannot build alignment: no sequences are loaded" return if len(self.selgenes) == 0: print "cannot build alignment: no sequences selected" return genes = list(self.selgenes) lookup = util.list2lookup(self.mat.rowlabels) self.aln = muscle.muscle(self.seqs.get(genes)) self.aln.names.sort(key=lambda x: lookup[x]) self.visaln = genomebrowser.show_align(self.aln) self.visaln.win.set_name("alignment")
def layout_arg(arg, leaves=None, yfunc=lambda x: x): """Layout the nodes of an ARG""" layout = {} # layout leaves if leaves is None: leafx = layout_arg_leaves(arg) else: leafx = util.list2lookup(leaves) for node in arg.postorder(): if node.is_leaf(): layout[node] = [leafx[node], yfunc(node.age)] else: layout[node] = [ stats.mean(layout[child][0] for child in node.children), yfunc(node.age)] return layout
def makePtree(tree): """Make parent tree array from tree""" nodes = [] nodelookup = {} ptree = [] def walk(node): for child in node.children: walk(child) nodes.append(node) walk(tree.root) def leafsort(a, b): if a.isLeaf(): if b.isLeaf(): return 0 else: return -1 else: if b.isLeaf(): return 1 else: return 0 # bring leaves to front nodes.sort(cmp=leafsort) nodelookup = util.list2lookup(nodes) for node in nodes: if node == tree.root: ptree.append(-1) else: ptree.append(nodelookup[node.parent]) assert nodes[-1] == tree.root return ptree, nodes, nodelookup
def makeTopologyMatrix(tree, genes): # find how edges split vertices network = treelib.tree2graph(tree) splits = find_all_branch_splits(network, set(genes)) edges = splits.keys() # create topology matrix n = len(genes) ndists = n*(n-1) / 2 topmat = util.makeMatrix(ndists, len(edges)) vlookup = util.list2lookup(genes) n = len(genes) for e in xrange(len(edges)): set1, set2 = splits[edges[e]] for gene1 in set1: for gene2 in set2: i, j = util.sort([vlookup[gene1], vlookup[gene2]]) index = i*n-i*(i+1)/2+j-i-1 topmat[index][e] = 1.0 return topmat, edges
def order_names(self, aln): """Orders the names in the same order they appear in aln""" lookup = util.list2lookup(aln.keys()) self.names.sort(key=lambda x: lookup[x])