def tree_threeway_counts(tree, lca_depths, alphabet=DnaPairs, attr='Sequence'): """From tree and array of lca_depths, returns n*n*n array of Count objects. n is number of leaves. lca_depths: array (leaf * leaf) of depths of last common ancestor. alphabet: pair alphabet for input sequences. Returns dict containing counts for (i, j, k) and (j, i, k) where k is the outgroup of the three sequences. Will pick an arbitrary node to be the outgroup if there is a polytomy. Note: Leaves of tree must have sequences already assigned. """ outgroup_last = tree.outgroupLast leaves = list(tree.traverse()) result = {} for first, second, third in three_item_combos(leaves): new_first, new_second, new_third = outgroup_last(first, second, third) #get the sequence from each node seq_1 = getattr(new_first, attr) seq_2 = getattr(new_second, attr) seq_3 = getattr(new_third, attr) result[(new_first.Id, new_second.Id, new_third.Id)] = \ Counts.fromTriple(seq_1, seq_2, seq_3, alphabet) #don't forget to do counts from both the non-outgroups result[(new_second.Id, new_first.Id, new_third.Id)] = \ Counts.fromTriple(seq_2, seq_1, seq_3, alphabet) return result
def test_three_item_combos(self): """three_item_combos should return items in correct order""" items = list(three_item_combos("abcde")) self.assertEqual(items, map(tuple, ["abc", "abd", "abe", "acd", "ace", "ade", "bcd", "bce", "bde", "cde"]))
def test_three_item_combos(self): """three_item_combos should return items in correct order""" items = list(three_item_combos('abcde')) self.assertEqual(items, map(tuple, \ ['abc','abd','abe','acd','ace','ade','bcd','bce','bde','cde']))