在 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 檔案,請使用帶有 '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 足以滿足大多數使用案例。
在 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
物件支援,分別疊代包含的親緣關係和子分支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
– 代表物件樹中的節點和本機資訊其他
(待辦)
此模組使用的類別繼承自 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,發布了一些使用此格式的軟體
另一個列表在此維護。