Bio.SeqIO.SffIO 模組
Bio.SeqIO 支援二進制標準流程圖格式 (SFF) 檔案格式。
SFF 由 454 Life Sciences (Roche)、懷海德生物醫學研究所和威康信託桑格研究所設計。SFF 也被用作 Ion Torrent 的 PGM 平台早期版本的原生輸出格式。您應該透過 Bio.SeqIO 函數,以格式名稱「sff」(或如下所述的「sff-trim」)來使用此模組。
例如,要迭代 SFF 檔案中的記錄,
>>> from Bio import SeqIO
>>> for record in SeqIO.parse("Roche/E3MFGYR02_random_10_reads.sff", "sff"):
... print("%s %i %s..." % (record.id, len(record), record.seq[:20]))
...
E3MFGYR02JWQ7T 265 tcagGGTCTACATGTTGGTT...
E3MFGYR02JA6IL 271 tcagTTTTTTTTGGAAAGGA...
E3MFGYR02JHD4H 310 tcagAAAGACAAGTGGTATC...
E3MFGYR02GFKUC 299 tcagCGGCCGGGCCTCTCAT...
E3MFGYR02FTGED 281 tcagTGGTAATGGGGGGAAA...
E3MFGYR02FR9G7 261 tcagCTCCGTAAGAAGGTGC...
E3MFGYR02GAZMS 278 tcagAAAGAAGTAAGGTAAA...
E3MFGYR02HHZ8O 221 tcagACTTTCTTCTTTACCG...
E3MFGYR02GPGB1 269 tcagAAGCAGTGGTATCAAC...
E3MFGYR02F7Z7G 219 tcagAATCATCCACTTTTTA...
每個 SeqRecord 物件將包含 SFF 檔案中的所有註釋,包括 PHRED 品質分數。
>>> print("%s %i" % (record.id, len(record)))
E3MFGYR02F7Z7G 219
>>> print("%s..." % record.seq[:10])
tcagAATCAT...
>>> print("%r..." % (record.letter_annotations["phred_quality"][:10]))
[22, 21, 23, 28, 26, 15, 12, 21, 28, 21]...
請注意,序列以混合大小寫給出,中央大寫區域對應於修剪後的序列。這與 Roche 工具(以及第三方工具 sff_extract)用於將 SFF 轉換為 FASTA 的輸出相符。
>>> print(record.annotations["clip_qual_left"])
4
>>> print(record.annotations["clip_qual_right"])
134
>>> print(record.seq[:4])
tcag
>>> print("%s...%s" % (record.seq[4:20], record.seq[120:134]))
AATCATCCACTTTTTA...CAAAACACAAACAG
>>> print(record.seq[134:])
atcttatcaacaaaactcaaagttcctaactgagacacgcaacaggggataagacaaggcacacaggggataggnnnnnnnnnnn
註釋字典也包含任何接合子剪輯位置(通常為零)以及有關流程的資訊。例如:
>>> len(record.annotations)
12
>>> print(record.annotations["flow_key"])
TCAG
>>> print(record.annotations["flow_values"][:10])
(83, 1, 128, 7, 4, 84, 6, 106, 3, 172)
>>> print(len(record.annotations["flow_values"]))
400
>>> print(record.annotations["flow_index"][:10])
(1, 2, 3, 2, 2, 0, 3, 2, 3, 3)
>>> print(len(record.annotations["flow_index"]))
219
請注意,若要從 flow_values 中的原始讀取值轉換為對應的同聚物延伸估計值,該值應四捨五入到最接近的 100
>>> print("%r..." % [int(round(value, -2)) // 100
... for value in record.annotations["flow_values"][:10]])
...
[1, 0, 1, 0, 0, 1, 0, 1, 0, 2]...
如果讀取名稱恰好是 14 個字母數字字符,則註釋字典也將包含透過將名稱解讀為 454 定序系統「通用」登錄編號而提取的有關讀取的元數據。請注意,如果讀取名稱恰好是 14 個字母數字字符,但不是自動產生的,則這些註釋記錄將包含無意義的資訊。
>>> print(record.annotations["region"])
2
>>> print(record.annotations["time"])
[2008, 1, 9, 16, 16, 0]
>>> print(record.annotations["coords"])
(2434, 1658)
作為一種便利方法,您可以使用 SeqIO 格式名稱「sff-trim」而不是「sff」來讀取檔案,以僅取得修剪後的序列(除了 PHRED 品質分數和讀取名稱中編碼的任何內容之外,沒有任何註釋)
>>> from Bio import SeqIO
>>> for record in SeqIO.parse("Roche/E3MFGYR02_random_10_reads.sff", "sff-trim"):
... print("%s %i %s..." % (record.id, len(record), record.seq[:20]))
...
E3MFGYR02JWQ7T 260 GGTCTACATGTTGGTTAACC...
E3MFGYR02JA6IL 265 TTTTTTTTGGAAAGGAAAAC...
E3MFGYR02JHD4H 292 AAAGACAAGTGGTATCAACG...
E3MFGYR02GFKUC 295 CGGCCGGGCCTCTCATCGGT...
E3MFGYR02FTGED 277 TGGTAATGGGGGGAAATTTA...
E3MFGYR02FR9G7 256 CTCCGTAAGAAGGTGCTGCC...
E3MFGYR02GAZMS 271 AAAGAAGTAAGGTAAATAAC...
E3MFGYR02HHZ8O 150 ACTTTCTTCTTTACCGTAAC...
E3MFGYR02GPGB1 221 AAGCAGTGGTATCAACGCAG...
E3MFGYR02F7Z7G 130 AATCATCCACTTTTTAACGT...
更詳細地查看最後一筆記錄,請注意這與上面的範例有何不同
>>> print("%s %i" % (record.id, len(record)))
E3MFGYR02F7Z7G 130
>>> print("%s..." % record.seq[:10])
AATCATCCAC...
>>> print("%r..." % record.letter_annotations["phred_quality"][:10])
[26, 15, 12, 21, 28, 21, 36, 28, 27, 27]...
>>> len(record.annotations)
4
>>> print(record.annotations["region"])
2
>>> print(record.annotations["coords"])
(2434, 1658)
>>> print(record.annotations["time"])
[2008, 1, 9, 16, 16, 0]
>>> print(record.annotations["molecule_type"])
DNA
您可以使用 Bio.SeqIO.convert() 函數將(修剪後的)SFF 讀取值轉換為 FASTQ 檔案(或 FASTA 檔案和 QUAL 檔案),例如:
>>> from Bio import SeqIO
>>> from io import StringIO
>>> out_handle = StringIO()
>>> count = SeqIO.convert("Roche/E3MFGYR02_random_10_reads.sff", "sff",
... out_handle, "fastq")
...
>>> print("Converted %i records" % count)
Converted 10 records
輸出的 FASTQ 檔案將會像這樣開始
>>> print("%s..." % out_handle.getvalue()[:50])
@E3MFGYR02JWQ7T
tcagGGTCTACATGTTGGTTAACCCGTACTGATT...
Bio.SeqIO.index() 提供以記憶體效率的方式,透過名稱隨機存取 SFF 檔案中的讀取值。SFF 檔案可以在檔案中包含索引,以便讀取索引,使其速度非常快。如果遺失索引(或 Biopython 中尚未支援的格式),則會掃描所有讀取值來索引檔案 - 這會稍微慢一點。例如:
>>> from Bio import SeqIO
>>> reads = SeqIO.index("Roche/E3MFGYR02_random_10_reads.sff", "sff")
>>> record = reads["E3MFGYR02JHD4H"]
>>> print("%s %i %s..." % (record.id, len(record), record.seq[:20]))
E3MFGYR02JHD4H 310 tcagAAAGACAAGTGGTATC...
>>> reads.close()
或者,使用修剪後的讀取值
>>> from Bio import SeqIO
>>> reads = SeqIO.index("Roche/E3MFGYR02_random_10_reads.sff", "sff-trim")
>>> record = reads["E3MFGYR02JHD4H"]
>>> print("%s %i %s..." % (record.id, len(record), record.seq[:20]))
E3MFGYR02JHD4H 292 AAAGACAAGTGGTATCAACG...
>>> reads.close()
您也可以將 Bio.SeqIO.write() 函數與「sff」格式一起使用。請注意,這需要所有流程資訊等,因此可能僅適用於最初從讀取另一個 SFF 檔案而來的 SeqRecord 物件(而不是將 SFF 檔案剖析為「sff-trim」而來的修剪後的 SeqRecord 物件)。
舉例來說,讓我們假裝此 SFF 範例檔案代表一些使用 PCR 引子 AAAGANNNNN 預先放大的 DNA。以下腳本將產生一個子檔案,其中包含所有品質修剪區域後(即修剪後)的序列以 AAAGA 開頭(此假引子的非退化位元)的讀取值
>>> from Bio import SeqIO
>>> records = (record for record in
... SeqIO.parse("Roche/E3MFGYR02_random_10_reads.sff", "sff")
... if record.seq[record.annotations["clip_qual_left"]:].startswith("AAAGA"))
...
>>> count = SeqIO.write(records, "temp_filtered.sff", "sff")
>>> print("Selected %i records" % count)
Selected 2 records
當然,對於組裝,您可能想要移除這些引子。如果您想要 FASTA 或 FASTQ 輸出,您可以只切片 SeqRecord。但是,如果您想要 SFF 輸出,我們必須保留所有流程資訊 - 訣竅是僅調整左側剪輯位置!
>>> from Bio import SeqIO
>>> def filter_and_trim(records, primer):
... for record in records:
... if record.seq[record.annotations["clip_qual_left"]:].startswith(primer):
... record.annotations["clip_qual_left"] += len(primer)
... yield record
...
>>> records = SeqIO.parse("Roche/E3MFGYR02_random_10_reads.sff", "sff")
>>> count = SeqIO.write(filter_and_trim(records, "AAAGA"),
... "temp_filtered.sff", "sff")
...
>>> print("Selected %i records" % count)
Selected 2 records
我們可以檢查結果,請注意,現在小寫剪輯區域包含「AAAGA」序列
>>> for record in SeqIO.parse("temp_filtered.sff", "sff"):
... print("%s %i %s..." % (record.id, len(record), record.seq[:20]))
...
E3MFGYR02JHD4H 310 tcagaaagaCAAGTGGTATC...
E3MFGYR02GAZMS 278 tcagaaagaAGTAAGGTAAA...
>>> for record in SeqIO.parse("temp_filtered.sff", "sff-trim"):
... print("%s %i %s..." % (record.id, len(record), record.seq[:20]))
...
E3MFGYR02JHD4H 287 CAAGTGGTATCAACGCAGAG...
E3MFGYR02GAZMS 266 AGTAAGGTAAATAACAAACG...
>>> import os
>>> os.remove("temp_filtered.sff")
有關檔案格式的說明,請參閱 Roche 手冊和:http://www.ncbi.nlm.nih.gov/Traces/trace.cgi?cmd=show&f=formats&m=doc&s=formats
- Bio.SeqIO.SffIO.ReadRocheXmlManifest(handle)
讀取 SFF「索引」中的任何 Roche 樣式 XML 資訊清單資料。
SFF 檔案格式允許多個不同的索引區塊,而 Roche 利用這一點來定義他們自己的索引區塊,其中也嵌入了 XML 資訊清單字串。這不是 SFF 檔案格式的公開文件擴充功能,這是反向工程而來的。
此 handle 應為以二進制模式開啟的 SFF 檔案。此函數將使用 handle 的 seek/tell 函數,並將 handle 保留在任意位置。
找到的任何 XML 資訊清單都會以 Python 字串的形式傳回,您可以根據需要剖析該字串,或在使用 SffWriter 類別寫出 SFF 檔案時重複使用。
傳回字串,如果找不到 Roche 資訊清單,則會引發 ValueError。
- class Bio.SeqIO.SffIO.SffIterator(source, alphabet=None, trim=False)
基底類別:
SequenceIterator
用於標準流程圖格式 (SFF) 檔案的剖析器。
- __init__(source, alphabet=None, trim=False)
迭代標準流程圖格式 (SFF) 讀取值(以 SeqRecord 物件表示)。
source - SFF 檔案的路徑,例如來自 Roche 454 定序,或以二進制模式開啟的類檔案物件。
alphabet - 可選字母,未使用。保留為 None。
trim - 是否應修剪序列?
產生的 SeqRecord 物件應與使用 Roche 454 工具 ssfinfo 從 SFF 檔案轉換的配對 FASTA 和 QUAL 檔案中的物件相符。也就是說,序列將為混合大小寫,修剪區域以小寫顯示。
此函數在內部透過 Bio.SeqIO 函數使用
>>> from Bio import SeqIO >>> for record in SeqIO.parse("Roche/E3MFGYR02_random_10_reads.sff", "sff"): ... print("%s %i" % (record.id, len(record))) ... E3MFGYR02JWQ7T 265 E3MFGYR02JA6IL 271 E3MFGYR02JHD4H 310 E3MFGYR02GFKUC 299 E3MFGYR02FTGED 281 E3MFGYR02FR9G7 261 E3MFGYR02GAZMS 278 E3MFGYR02HHZ8O 221 E3MFGYR02GPGB1 269 E3MFGYR02F7Z7G 219
您也可以直接呼叫它
>>> with open("Roche/E3MFGYR02_random_10_reads.sff", "rb") as handle: ... for record in SffIterator(handle): ... print("%s %i" % (record.id, len(record))) ... E3MFGYR02JWQ7T 265 E3MFGYR02JA6IL 271 E3MFGYR02JHD4H 310 E3MFGYR02GFKUC 299 E3MFGYR02FTGED 281 E3MFGYR02FR9G7 261 E3MFGYR02GAZMS 278 E3MFGYR02HHZ8O 221 E3MFGYR02GPGB1 269 E3MFGYR02F7Z7G 219
或者,使用 trim 選項
>>> with open("Roche/E3MFGYR02_random_10_reads.sff", "rb") as handle: ... for record in SffIterator(handle, trim=True): ... print("%s %i" % (record.id, len(record))) ... E3MFGYR02JWQ7T 260 E3MFGYR02JA6IL 265 E3MFGYR02JHD4H 292 E3MFGYR02GFKUC 295 E3MFGYR02FTGED 277 E3MFGYR02FR9G7 256 E3MFGYR02GAZMS 271 E3MFGYR02HHZ8O 150 E3MFGYR02GPGB1 221 E3MFGYR02F7Z7G 130
- parse(handle)
開始剖析檔案,並傳回 SeqRecord 產生器。
- iterate(handle)
剖析檔案並產生 SeqRecord 物件。
- __abstractmethods__ = frozenset({})
- __parameters__ = ()
- class Bio.SeqIO.SffIO.SffWriter(target, index=True, xml=None)
基底類別:
SequenceWriter
SFF 檔案寫入器。
- __init__(target, index=True, xml=None)
初始化 SFF 寫入器物件。
- 參數
target - 以二進制模式開啟的輸出串流,或是檔案路徑。
index - 布林值參數,是否嘗試寫入索引?
xml - 可選的字串參數,將記錄在索引區塊中的 XML 清單 (請參閱 ReadRocheXmlManifest 函式以讀取此資料)。
- write_file(records)
使用此方法寫入包含指定記錄的完整檔案。
- write_header()
寫入 SFF 檔案標頭。
- write_record(record)
將單一額外記錄寫入輸出檔案。
此方法假設標頭已完成寫入。