在 GitHub 上编辑此页面

使用 PhyloXML 模块处理 phyloXML 文件。

Bio.Phylo 中,Biopython 用于处理系统发育树的模块,PhyloXMLPhyloXMLIO 子模块负责解析、生成和操作 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 中的基类派生的;有关此对象表示的更多信息,请参阅该页面。

I/O 函数

要开始使用 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 就足够了。

PhyloXMLIO

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
...

使用 PhyloXML 对象

在合理的地方支持标准 Python 语法糖。

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()。一些用例

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

Phylogeny

Clade

Other

注释类型

(待定)

与 Biopython 的其他部分集成

此模块使用的类继承自 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 规范的作者之一,他已经发布了一些使用这种格式的软件

另一个列表保存在 此处