def __init__(self, edge, use_lengths=True): children = [type(self)(child) for child in edge.Children] TreeNode.__init__(self, Params=edge.params.copy(), Children=children, Name=("" if children else edge.Name)) self.Length = edge.Length self.original = edge # for edge_color_callback self.Collapsed = False self.use_lengths_default = use_lengths
def make_consensus_tree(cons_split, check_for_rank=True, tips=None): """Returns a mapping by rank for names to their parent names and counts""" god_node = TreeNode(Name=None) god_node.Rank = None base = cons_split[0] cur_node = god_node # create a base path in the tree for rank, name in enumerate(base): new_node = TreeNode(Name=name) new_node.Rank = rank cur_node.append(new_node) cur_node = new_node # setup the initial childlookup structure so taht we don't have to # always iterate over .Children for n in god_node.traverse(include_self=True): if n.istip(): n.ChildLookup = {} continue n.ChildLookup = {n.Children[0].Name:n.Children[0]} # for every consensus string, start at the "god" node for idx,con in enumerate(cons_split): cur_node = god_node # for each name, see if we've seen it, if not, add that puppy on for rank, name in enumerate(con): if name in cur_node.ChildLookup: cur_node = cur_node.ChildLookup[name] else: #print "adding to %s to %s" % (name, cur_node.Name) new_node = TreeNode(Name=name) new_node.Rank = rank new_node.ChildLookup = {} cur_node.append(new_node) cur_node.ChildLookup[name] = new_node cur_node = new_node if tips is not None: cur_node.append(TreeNode(Name=tips[idx])) # build an assist lookup dict lookup = {} for node in god_node.traverse(): if node.Name is None: continue if check_for_rank and '__' in node.Name and \ node.Name.split('__')[1] == '': continue lookup[node.Name] = node return god_node, lookup
def mergetree(left, right, working_dir): """Reconstruct a tree from merge order""" # decorate and infer filenames for tips global INTERNAL_COUNT if not isinstance(left, TreeNode): filepath = str(left[0]) name = basename(filepath.split('.')[0]) left = TreeNode(Name=name) left.FilePath = filepath left.Processed = False left.PollPath = None # doesn't make sense for tips left.FullCommand = None left.EndTime = None left.StartTime = None left.TotalTime = None if not isinstance(right, TreeNode): filepath = str(right[0]) name = basename(filepath.split('.')[0]) right = TreeNode(Name=name) right.FilePath = filepath right.Processed = False right.PollPath = None # doesn't make sense for tips right.FullCommand = None right.EndTime = None right.StartTime = None right.TotalTime = None # internal node name = str(INTERNAL_COUNT) filepath = join(working_dir, name) + '.biom' merged = TreeNode(Name=name, Children=[left, right]) merged.FilePath = filepath merged.Processed = False merged.PollPath = filepath + '.poll' merged.FullCommand = None merged.EndTime = None merged.StartTime = None merged.TotalTime = None INTERNAL_COUNT += 1 return merged