def layout_chroms(arg, start=None, end=None): if start is None: start = arg.start if end is None: end = arg.end tree = arg.get_marginal_tree(start) arglib.remove_single_lineages(tree) last_pos = start blocks = [] leaf_layout = [] layout_func = layout_tree_leaves #layout_func = layout_tree_leaves_even for spr in arglib.iter_arg_sprs(arg, start=start, end=end, use_leaves=True): print "layout", spr[0] blocks.append([last_pos, spr[0]]) leaf_layout.append(layout_func(tree)) inorder = dict((n, i) for i, n in enumerate(inorder_tree(tree))) # determine SPR nodes rnode = arglib.arg_lca(tree, spr[1][0], spr[0]) cnode = arglib.arg_lca(tree, spr[2][0], spr[0]) # determine best side for adding new sister left = (inorder[rnode] < inorder[cnode]) # apply spr arglib.apply_spr(tree, rnode, spr[1][1], cnode, spr[2][1], spr[0]) # adjust sister rindex = rnode.parents[0].children.index(rnode) if left and rindex != 0: rnode.parents[0].children.reverse() last_pos = spr[0] blocks.append([last_pos, end]) leaf_layout.append(layout_func(tree)) return blocks, leaf_layout