"clean" 来自超短分支的 ete3 树

"clean" ete3 tree from super short branches

我的树构建工具喜欢二叉树。为了得到这样的树,它经常引入超小分支以使其保持二进制结构。

当我尝试比较树时,这对我来说非常烦人,因为那些小树枝引入了不应该存在的分裂。

如果分支长度小于指定限制,是否有使用 ete3(或其他库)清理分支树的简单方法?

举个例子,设从根到AB的分支长度小于极限:

      /-A
   /-|
  |   \-B
--|
  |     /-C
   \---|
        \-D

那么生成的树应该是这样的:

   /-A
  |
  |--B
--|
  |     /-C
   \---|
        \-D

我这样试过:

from ete3 import Tree

tree = "((A:0.1,B:0.2):0.005,(C:0.3,D:0.4):0.009);"


t1 = Tree(tree, quoted_node_names=True, format=1)


limit = 0.006

for node in t1.iter_descendants():
    if node.dist <= limit:
        nn = node._children
        nodelist = []
        for n in nn:
            nodelist.append(n.name)
        for n in nodelist:
            parent = node.up
            remove = t1.search_nodes(name=n)
            remove[0].delete()
            # parent._children.append(remove)



print(t1)

导致这棵树:

        /-C
-- /---|
        \-D

所以我设法剪掉了 A 和 B 叶子 - 但我无法将它们连接到上部节点。

这是实现此目标的有效策略吗?

如果没有,我该如何解决这个问题?

非常感谢您,

最佳,

t.

哦,这比预期的要容易得多:

for node in t1.get_descendants():
    if not node.is_leaf() and node._dist <= limit:
        node.delete()

做到了。