"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()
做到了。
我的树构建工具喜欢二叉树。为了得到这样的树,它经常引入超小分支以使其保持二进制结构。
当我尝试比较树时,这对我来说非常烦人,因为那些小树枝引入了不应该存在的分裂。
如果分支长度小于指定限制,是否有使用 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()
做到了。