在 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 檔案,請使用帶有 'phyloxml' 格式引數的 Phylo 套件

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

其他

註釋類型

(待辦)

與 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 次執行中最佳的一次

檔案 外部節點 大小(未壓縮) 讀取 (s) 解析 (s) 寫入 (s)
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 的其餘部分整合。

phyloXML 規格的作者之一 Christian Zmasek,發布了一些使用此格式的軟體

另一個列表在此維護。