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' .
引用