在 Bio.Phylo
中,Biopython 用于处理系统发育树的模块,PhyloXML
和 PhyloXMLIO
子模块负责解析、生成和操作 phyloXML 格式的文件。
一个完整的 phyloXML 文档有一个带有 phyloxml 标签的根节点。根节点下直接是一系列 phylogeny 元素(系统发育树),后面可能还有一些不在 phyloXML 规范中的其他任意数据。这些系统发育树的主要结构元素是 Clade:树有一个 clade 属性以及其他属性,每个 clade 递归地包含一系列 clade(以及其他属性)。
每个 XML 节点的子节点和属性被映射到 PhyloXML
模块中的类,尽可能保持相同的名称;XML 文档结构在 Bio.Phylo.PhyloXMLIO.read()
生成的 Phyloxml
对象中得到了很好的体现,并且 Bio.Phylo.read()
和 parse()
生成的 Phylogeny
对象也是如此。
例如,这个 XML(来自 Tests/PhyloXML/example.xml)
<?xml version="1.0" encoding="UTF-8"?>
<phyloxml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.phyloxml.org http://www.phyloxml.org/1.10/phyloxml.xsd" xmlns="http://www.phyloxml.org">
<phylogeny rooted="true">
<name>An example</name>
<clade>
<clade branch_length="0.06">
<clade branch_length="0.102">
<name>A</name>
</clade>
<clade branch_length="0.23">
<name>B</name>
</clade>
</clade>
<clade branch_length="0.4">
<name>C</name>
</clade>
</clade>
</phylogeny>
</phyloxml>
会生成一个这样的对象层次结构
>>> from Bio import Phylo
>>> tree = Phylo.read("example.xml", "phyloxml")
>>> print(tree)
Phylogeny(description='phyloXML allows to use either a "branch_length" attribute
...', name='example from Prof. Joe Felsensteins book "Inferring Phyl..."', roote
d=True)
Clade()
Clade(branch_length=0.06)
Clade(branch_length=0.102, name='A')
Clade(branch_length=0.23, name='B')
Clade(branch_length=0.4, name='C')
>>>
它表示这样的一个系统发育树
>>> Phylo.draw_ascii(tree)
__________________ A
__________|
_| |___________________________________________ B
|
|___________________________________________________________________________ C
>>>
树对象是从 Bio.Phylo
中的基类派生的;有关此对象表示的更多信息,请参阅该页面。
要开始使用 phyloXML 文件,请使用 Phylo
包,并将 'phyloxml' 作为格式参数
>>> from Bio import Phylo
>>> tree = Phylo.read('some-trees.xml', 'phyloxml')
# ValueError: There are multiple trees in this file; use parse() instead.
>>> trees = Phylo.parse('some-trees.xml', 'phyloxml')
>>> Phylo.write(trees.next(), 'first-tree.xml', 'phyloxml')
1
>>> Phylo.write(trees, 'rest-trees.xml', 'phyloxml')
12
这些函数与来自 Bio.Phylo.PhyloXML
模块的 Phylogeny 对象(从 BaseTree.Tree
派生)一起工作。对于大多数用例,这个标准 API 就足够了。
在 Bio.Phylo
中,phyloXML 格式的 I/O 函数在 PhyloXMLIO
子模块中实现。要访问一些超出基本 Phylo
I/O API 的附加功能,或者跳过每次都指定 'phyloxml' 格式参数,可以直接导入它
from Bio.Phylo import PhyloXMLIO
read()
函数返回一个表示整个文件数据的单个 Bio.Phylo.PhyloXML.Phyloxml
对象。系统发育树在 .phylogenies
属性中,任何其他任意数据都存储在 .other
中。
>>> phx = PhyloXMLIO.read('phyloxml_examples.xml')
>>> print(phx)
Phyloxml
>>> len(phx.phylogenies)
13
>>> len(phx.other)
1
>>> print(phx.other)
[Other(tag='alignment', namespace='http://example.org/align')]
>>> print(phx.other[0].children)
[Other(tag='seq', namespace='http://www.phyloxml.org', value='acgtcgcggcccgtggaagtcctctcct'),
Other(tag='seq', namespace='http://www.phyloxml.org', value='aggtcgcggcctgtggaagtcctctcct'),
Other(tag='seq', namespace='http://www.phyloxml.org', value='taaatcgc--cccgtgg-agtccc-cct')]
如果您对“其他”数据不感兴趣,可以使用 parse()
来迭代地仅构建文件中包含的系统发育树——这与使用 'phyloxml' 格式参数调用 Phylo.parse()
完全相同。
PhyloXMLIO.write()
与 Phylo.write()
类似,但它还可以接受一个 Phyloxml
对象(read()
或 to_phyloxml()
的结果)进行序列化。可以选择指定 UTF-8 以外的编码。
>>> phx = PhyloXMLIO.read('phyloxml_examples.xml')
>>> print(phx.other)
[Other(tag='alignment', namespace='http://example.org/align')]
>>> phx.other = []
>>> PhyloXMLIO.write(phx, 'ex_no_other.xml')
13
>>> phx_no = PhyloXMLIO.read('ex_no_other.xml')
>>> phx_no.other
[]
PhyloXMLIO
还包含一个名为 dump_tags()
的实用程序,用于打印在 phyloXML 文件中遇到的所有 XML 标签。这对于调试很有帮助,或者可以在命令行中与 grep 或 sort -u 一起使用以获取 phyloXML 文件包含的标签列表。
>>> PhyloXMLIO.dump_tags('phyloxml_examples.xml')
{http://www.phyloxml.org}phyloxml
{http://www.phyloxml.org}phylogeny
{http://www.phyloxml.org}name
{http://www.phyloxml.org}description
{http://www.phyloxml.org}clade
...
在合理的地方支持标准 Python 语法糖。
str()
会创建一个包含对象类名称和标识符的字符串,适用于在生成的图形中为节点添加标签repr()
会创建一个类似于对象构造函数调用的字符串,这样 eval(repr(obj))
将为更简单的 PhyloXML
对象返回 obj
,至少可以部分重建更复杂的对象。iter()
受 PhyloXML
和 Clade
对象的支持,分别对包含的系统发育树和子 clade 进行迭代len()
受支持迭代的相同对象的 支持,具有预期结果Clade
对象还支持切片和多重索引
tree = Phylo.parse("example.xml", "phyloxml").next()
assert tree.clade[0] == tree.clade.clades[0]
assert tree.clade[0, 1] == tree.clade.clades[0].clades[1]
由于有效的 Phylogeny 对象总是只有一个 clade 属性,因此这种索引方式是一种便捷的方式,可以让你在知道确切位置的情况下,访问树中深埋的特定节点。
有两种方法可以将选择转换为新的 PhyloXML
对象:Phylogeny.to_phyloxml()
和 Clade.to_phylogeny()
。一些用例
PhyloXML
对象。for tree in Phylo.parse("example.xml", "phyloxml"):
if tree.name == "monitor lizards":
mon_lizard_tree = tree.to_phyloxml()
tree = Phylo.parse("example.xml", "phyloxml").next()
best = None
for clade in tree.clade:
if clade.confidences[0].type == "bootstrap" and (
best is None or clade.confidences[0].value > best.confidences[0].value
):
best = clade
phyloxml = best.to_phylogeny(rooted=True).to_phyloxml()
Phylo.write(phyloxml, "example_best.xml", "phyloxml")
Phyloxml
Bio.Phylo
I/O 函数使用Phylogeny
Tree
派生——全局树对象Clade
Subtree
派生——表示对象树中的节点,以及本地信息Other
(待定)
此模块使用的类继承自 Phylo
模块的通用 BaseTree
类,因此可以访问这些基类上定义的方法。由于 phyloXML 规范非常详细,这些子类被保存在一个单独的模块 Bio.Phylo.PhyloXML
中,并提供用于在 phyloXML 和标准 Biopython 类型之间转换的附加方法。
PhyloXML.Sequence
类包含用于在 Biopython SeqRecord
对象之间转换的方法——to_seqrecord()
和 from_seqrecord()
。这包括分子序列 mol_seq
) 作为 Seq
对象,以及蛋白质结构域体系结构作为 SeqFeature
对象的列表。同样,PhyloXML.ProteinDomain
对象有一个 .to_seqfeature()
方法。
此解析器旨在能够处理大型文件,这意味着数千个外部节点(有关 Python 相关 XML 解析器的基准测试,请参见 此处)。它已通过此大小的文件测试;例如,完整的 NCBI 分类系统大约需要 100 秒才能解析,并消耗约 1.3 GB 的内存。如果系统中有足够的内存可用,写入器也可以重建这种大小的 phyloXML 文件。
read()
和 parse()
函数以大约相同的 CPU 时间处理一个完整的文件。大部分底层代码是相同的,大部分时间都花在了构建 Clade
对象(最常见的节点类型)上。对于小型文件(小于 ncbi_taxonomy_mollusca.xml
),write()
函数将完整的对象序列化回一个等效文件的速度比相应的 read()
调用略慢;对于非常大的文件,write()
完成的速度比 read()
更快。
以下是一些在 2.00GHz Intel Xeon E5405 处理器(仅使用 1 个 CPU 内核)上运行的 7.7GB 内存时间,运行在 Ubuntu 9.04 上的标准 Python 2.6.2,为每个函数选择 3 次运行中最好的结果
文件 | 外部节点 | 大小(未压缩) | 读取(秒) | 解析(秒) | 写入(秒) |
---|---|---|---|---|---|
apaf.xml | 38 KB | 0.01 | 0.01 | 0.02 | |
bcl_2.xml | 105 KB | 0.02 | 0.02 | 0.04 | |
ncbi_taxonomy_mollusca.xml | 5632 | 1.5 MB | 0.51 | 0.49 | 0.80 |
tol_life_on_earth_1.xml | 57124 | 46 MB | 10.28 | 10.67 | 10.36 |
ncbi_taxonomy_metazoa.xml | 73907 | 33 MB | 15.76 | 16.15 | 10.69 |
ncbi_taxonomy.xml | 263691 | 31 MB(未缩进) | 109.70 | 109.14 | 32.39 |
为了比较,Forester 和 ATV(见下文)中使用的基于 Java 的解析器读取相同文件的速度大约是 3-5 倍,对于最大的文件,速度甚至可以提高 15 倍。
此模块由 Eric Talevich 开发,作为 2009 年 Google 代码夏令营项目,为 Biopython 提供对 phyloXML 的支持,NESCent 作为指导组织,Brad Chapman 和 Christian Zmasek 作为导师。该项目的首页位于:PhyloSoC:Biopython 支持解析和编写 phyloXML
之后开发了 Phylo
模块,以便将此代码与 Biopython 的其他部分集成。
Christian Zmasek 是 phyloXML 规范的作者之一,他已经发布了一些使用这种格式的软件
另一个列表保存在 此处。