Newick格式 (skbio.io.format.newick
)¶
Newick格式 (newick
)以最小文件格式存储带加权边和节点名的生成树 [1]. 这对于表示系统发育树和分类学非常有用。Newick是1986年6月26日作为非正式规范创建的 [2].
格式支持¶
有嗅探员:是的
读者 |
writer |
对象类 |
---|---|---|
是的 |
是的 |
格式规范¶
Newick文件使用以下语法表示树。请参阅下面的简单英语格式说明。
形式语法¶
NEWICK ==> NODE ;
NODE ==> FORMATTING SUBTREE FORMATTING NODE_INFO FORMATTING
SUBTREE ==> ( CHILDREN ) | null
NODE_INFO ==> LABEL | LENGTH | LABEL FORMATTING LENGTH | null
FORMATTING ==> [ COMMENT_CHARS ] | whitespace | null
CHILDREN ==> NODE | CHILDREN , NODE
LABEL ==> ' ALL_CHARS ' | SAFE_CHARS
LENGTH ==> : FORMATTING NUMBER
COMMENT_CHARS ==> any
ALL_CHARS ==> any
SAFE_CHARS ==> any except: ,;:()[] and whitespace
NUMBER ==> a decimal or integer
备注
这个 _
安全字符内的字符将转换为 skbio.tree.TreeNode
反之亦然。
'
被认为是转义字符。逃跑 '
使用前面的 '
.
scikit-bio中newick的实现允许嵌套注释。逃跑 [
或 ]
在COMMENT_CHARS中,使用前面的 '
.
解释¶
Newick格式通过创建节点及其相互关系的最小表示来定义树。
基本符号¶
有几个符号定义节点,其中第一个是分号 (;
). 分号在其左侧创建一个根节点。回想一下,一棵树只能有一个根。
下一个符号是逗号 (,
),在其右侧创建一个节点。然而,光靠这两个是不够的。例如,想象以下字符串: , , , ;
. 很明显,有一个根,但其他3个节点(用逗号定义)没有关系。因此,在根级别有多个节点不是有效的Newick字符串。
为了提供这些关系,还有另一种结构:成对括号 (( )
). 它们被插入到现有节点的位置,并使其能够拥有子节点。放置 ( )
在一个节点的位置将在最左边的内边缘的圆括号内创建一个子节点。
规则的适用¶
在括号中添加逗号将创建两个子级: ( , )
(也称为分叉节点)。注意,只需要一个逗号,因为圆括号已经创建了一个子项。添加更多的逗号将产生更多的孩子谁是兄弟姐妹。例如,写作 ( , , , )
将创建一个具有4个子节点的多采购节点,这些子节点彼此是兄弟节点。
根的符号可以用来创建一个完整的树。这个 ;
将创建一个可以放置圆括号的根节点: ( );
. 添加逗号将创建更多子项: ( , );
. 这些规则可以递归地应用。无限: (( , ), ( , ));
.
信息添加节点¶
可以添加有关节点的信息来提高树的清晰度和意义。每个节点可以有一个标签和/或长度(到父节点)。Newick总是将节点信息放在节点位置的最右边。
从标签开始, (( , ), ( , ));
将成为 ((D, E)B, (F, G)C)A;
. 有一个命名的根 A
根的子元素(从左到右)是 B
和 C
. B
有孩子吗 D
和 E
和 C
有孩子吗 F
和 G
.
长度表示将节点连接到其父节点的距离(或边的权重)。必须是十进制或整数。举个例子,假设 D
is rather estranged from B
, and E
is very close. That can be written as: ((D:10, E:0.5)B, (F, G)C)A;
. Notice that the colon (:
) separates the label from the length. If the length is provided but the label is omitted, a colon must still precede the length (`` (:0.25,:0.5):0.0;```)。如果没有这个,长度将被解释为一个标签(正好是一个数字)。
备注
scikit-bio将在内部 float
从技术上说,即使是指数字符串 (1e-3
)支持)
高级标签和长度规则¶
可以使用更多字符来创建更具描述性的标签。创建标签时,由于Newick格式的限制,必须考虑一些规则。标准标签中不允许使用以下字符:括号、逗号、方括号、冒号、分号和空白。这些字符也不允许出现在一个长度内,长度有一个更严格的格式:十进制或整数。这些字符中的许多都是定义Newick树结构的符号,因此由于明显的原因而被禁止使用。尚未提及的符号是方括号 ([ ]
)和空白(空格、制表符和换行符)。
如果标签中需要这些字符呢?在简单的空格情况下,下划线 (_
)读时将转换为空格,写入时转换为空格。
如果需要一个文字下划线或任何其他提到的?标签可以用单引号转义(这意味着它的内容被理解为常规文本) ('
). 当标签用单引号括起来时,允许使用任何字符。如果转义标签或其他任何地方需要一个单引号,则可以使用另一个单引号对其进行转义。例如, A_1
是书面的 'A_1'
和 'A'_1
将是 '''A''_1'
.
行内注释¶
方括号定义注释,这是Newick格式中最不常用的部分。注释不包含在生成的对象中,只作为人类可读的文本存在,被解析器忽略。scikit bio中的实现允许嵌套注释 ([comment [nested]]
). 在现有注释中,未成对方括号可以在括号前用单引号转义。(这与转义单引号相同)。单引号具有最高的运算符优先级,因此无需担心从正确转义的标签中开始注释。
空白¶
在任何未转义的标签内或任何长度内都不允许空白,但在其他任何地方都是允许的。
告诫¶
Newick不能总是提供任何树的唯一表示,换句话说,同一棵树可以用多种方式编写。例如: (A, B);
同构于 (B, A);
. scikit-bio中的实现在其对象表示中保持给定的兄弟顺序。
Newick没有无根树的表示。一些生物软件包假设,当一棵分叉的树中存在三叉根时,树必须是无根的。在scikit-bio里, skbio.tree.TreeNode
将永远扎根于 newick
根 (;
)
格式参数¶
唯一支持的格式参数是 convert_underscores . 这是 True 默认情况下。什么时候? False ,在未转义标签中找到的下划线将不会转换为空格。这在读取下划线未转义的外部程序的输出时非常有用。此参数仅影响 read 操作。它不存在于 write 操作;它们总是正确地转义下划线。
示例
这是一个简单的Newick字符串。
>>> from io import StringIO
>>> from skbio import read
>>> from skbio.tree import TreeNode
>>> f = StringIO("((D, E)B, (F, G)C)A;")
>>> tree = read(f, format="newick", into=TreeNode)
>>> f.close()
>>> print(tree.ascii_art())
/-D
/B-------|
| \-E
-A-------|
| /-F
\C-------|
\-G
这是一个复杂的Newick字符串。
>>> f = StringIO("[example](a:0.1, 'b_b''':0.2, (c:0.3, d_d:0.4)e:0.5)f:0.0;")
>>> tree = read(f, format="newick", into=TreeNode)
>>> f.close()
>>> print(tree.ascii_art())
/-a
|
-f-------|--b_b'
|
| /-c
\e-------|
\-d d
请注意,该节点最初标记为 d_d
成为 d d
. 另外 'b_b'''
成为 b_b'
. 请注意,下划线保留在 b_b' .
引用