diff --git a/readseq.py b/readseqs.py similarity index 100% rename from readseq.py rename to readseqs.py diff --git a/tree.py b/tree.py deleted file mode 100644 index f210c20..0000000 --- a/tree.py +++ /dev/null @@ -1,140 +0,0 @@ -import random - -class node(object): - def __init__(self, ndnum): # initialization function - self.rsib = None # right sibling - self.lchild = None # left child - self.par = None # parent node - self.number = ndnum # node number - self.edgelen = 0.0 # branch length - self.height = 0.0 # height above root - self.deep = False # True if this node resulted from a deep coalescence - self.descendants = set([ndnum]) # set containing descendant leaf set - -def joinRandomPair(node_list, next_node_number, is_deep_coalescence): - # pick first of two lineages to join and delete from node_list - i = random.randint(1, len(node_list)) - ndi = node_list[i-1] - del node_list[i-1] - - # pick second of two lineages to join and delete from node_list - j = random.randint(1, len(node_list)) - ndj = node_list[j-1] - del node_list[j-1] - - # join selected nodes and add ancestor to node_list - ancnd = node(next_node_number) - ancnd.deep = is_deep_coalescence - ancnd.lchild = ndi - ancnd.descendants = set() - ancnd.descendants |= ndi.descendants - ancnd.descendants |= ndj.descendants - ndi.rsib = ndj - ndi.par = ancnd - ndj.par = ancnd - node_list.append(ancnd) - - return node_list - -def joinSpecificPair(node_list, i, j, next_node_number, is_deep_coalescence): - assert j != i - - ndi = None - for k,nd in enumerate(node_list): - if nd.number == i: - ndi = node_list.pop(k) - assert ndi is not None - - ndj = None - for k,nd in enumerate(node_list): - if nd.number == j: - ndj = node_list.pop(k) - assert ndj is not None - - # join selected nodes and add ancestor to node_list - ancnd = node(next_node_number) - ancnd.deep = is_deep_coalescence - ancnd.lchild = ndi - ancnd.descendants = set() - ancnd.descendants |= ndi.descendants - ancnd.descendants |= ndj.descendants - ndi.rsib = ndj - ndi.par = ancnd - ndj.par = ancnd - node_list.append(ancnd) - - return node_list - -def getPreorder(nd, start = True): - global _preorder - if start: - _preorder = [] - - _preorder.append(nd) - - if nd.lchild: - getPreorder(nd.lchild, False) - - if nd.rsib: - getPreorder(nd.rsib, False) - - return _preorder - -def flipAllNodesAbove(root): - node_list = getPreorder(root) - for nd in node_list: - if nd.lchild: - lc = nd.lchild - rc = lc.rsib - nd.lchild = rc - assert rc.rsib is None - rc.rsib = lc - lc.rsib = None - -def makeNewick(nd, brlen_scaler = 1.0, start = True): - global _newick - global _TL - if start: - _newick = '' - _TL = 0.0 - - if nd.lchild: - _newick += '(' - makeNewick(nd.lchild, brlen_scaler, False) - else: - blen = nd.edgelen*brlen_scaler - _TL += blen - _newick += '%d:%.5f' % (nd.number, blen) - - if nd.rsib: - _newick += ',' - makeNewick(nd.rsib, brlen_scaler, False) - elif nd.par is not None: - blen = nd.par.edgelen*brlen_scaler - _TL += blen - _newick += '):%.5f' % blen - - return _newick, _TL - -def calcActualHeight(root): - h = 0.0 - nd = root - while nd.lchild: - nd = nd.lchild - h += nd.edgelen - return h - -def sumEdgeLengths(root): - sum_edge_lengths = 0.0 - pre = getPreorder(root) - for nd in pre: - sum_edge_lengths += nd.edgelen - return sum_edge_lengths - -def countDeepCoalescences(root): - n = 0 - preorder = getPreorder(root) - for nd in preorder: - if nd.deep: - n += 1 - return n