Bio.SeqIO.SffIO 模块

Bio.SeqIO 对二进制标准流图格式 (SFF) 文件格式的支持。

SFF 由 454 Life Sciences (Roche)、怀特黑德生物医学研究所和 Wellcome Trust Sanger 研究所设计。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 文件格式的公开文档扩展,这是逆向工程的。

句柄应为以二进制模式打开的 SFF 文件。此函数将使用句柄 seek/tell 函数,并将句柄留在任意位置。

找到的任何 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

或者,使用修剪选项

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

将单个附加记录写入输出文件。

这假设头已经完成。