Bio.SeqIO.SffIO模块
Bio.SeqIO支持二进制标准流图格式(SFF)文件格式。
SFF由454 Life Sciences(Roche)、Whitehead生物医学研究所和Wellcome Trust Sanger Institute设计。SFF也被用作Ion Torrent CGM平台早期版本的原生输出格式。您需要通过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]...
请注意,该序列是以混合大小写给出的,中央大写区域对应于修剪序列。这与SFF到FASTA的Roche工具(和第三方工具sff_extract)的输出相匹配。
>>> 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()
您还可以使用具有“sff”格式的Bio.SeqIO. writer()函数。请注意,这需要所有流信息等,因此可能仅对最初读取另一个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")
有关文件格式的描述,请参阅罗氏手册和:http://www.ncbi.nlm.nih.gov/Traces/trace.cgi? cmd=show & f= forms & m=Doc & s= forms
- Bio.SeqIO.SffIO.ReadRocheXmlManifest(handle)
读取SFF“索引”中的任何罗氏风格的ML清单数据。
SFF文件格式允许多个不同的索引块,罗氏利用这一点定义了自己的索引块,该索引块还嵌入了一个HTML清单字符串。这不是SFF文件格式的公开文档扩展,这是反向工程的。
手柄应该是以二进制模式打开的SFF文件。此函数将使用handle seek/tell函数并将handle保留在任意位置。
找到的任何ML清单都将作为Python字符串返回,然后您可以根据情况对其进行解析,或者在使用SffWriter类写出SFF文件时重新使用。
返回字符串,或在找不到Roche清单时引发ValueHelp。
- class Bio.SeqIO.SffIO.SffIterator(source, alphabet=None, trim=False)
-
标准流图格式(SFF)文件的解析器。
- modes = 'b'
- read_header_fmt = '>2HI4H'
- read_header_size = 16
- __init__(source, alphabet=None, trim=False)
迭代标准流图格式(SFF)读取(作为SeqRecord对象)。
source -SFF文件(例如来自Roche 454测序)的路径,或以二进制模式打开的类似文件的对象。
字母表-可选字母表,未使用。离开为无。
修剪-序列应该修剪吗?
生成的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
或者,使用修剪选项:
>>> 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
- __next__()
返回下一个SeqRecord。
此方法必须由子类实现。
- __abstractmethods__ = frozenset({})
- __annotations__ = {}
- __firstlineno__ = 749
- __parameters__ = ()
- __static_attributes__ = ('_offset', '_read_counter', 'flow_chars', 'index_length', 'index_offset', 'key_sequence', 'number_of_reads', 'read_flow_fmt', 'read_flow_size', 'trim')
- class Bio.SeqIO.SffIO.SffWriter(target, index=True, xml=None)
-
SFF文件编写器。
- modes = 'b'
- __init__(target, index=True, xml=None)
初始化SFF编写器对象。
- 论点:
目标-以二进制模式打开的输出流,或文件的路径。
index -布尔参数,我们应该尝试编写索引吗?
html-可选字符串参数,要记录在索引块中的html清单(请参阅函数ReadRocheXtmlManifest以读取此数据)。
- write_records(records)
将记录写入输出文件,并返回记录数。
records -返回SeqRecord对象的列表或迭代器
- write_header()
写入SFF文件头。
- write_record(record)
将单个额外记录写入输出文件。
这假设标题已完成。
- __abstractmethods__ = frozenset({})
- __annotations__ = {}
- __firstlineno__ = 1121
- __parameters__ = ()
- __static_attributes__ = ('_flow_chars', '_index', '_index_length', '_index_start', '_key_sequence', '_number_of_flows_per_read', '_number_of_reads', '_xml')