Bio.SeqIO.SffIO模块

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

SFF由454生命科学(罗氏)、怀特黑德生物医学研究所和惠康信托桑格研究所设计。sff也被用作来自Ion激流的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]...

请注意,该序列是以混合大小写形式给出的,中央大写区域对应于修剪后的序列。这与从SFF到FASTA的罗氏工具(和第三方工具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...

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

有关文件格式的说明,请参阅罗氏手册和:http://www.ncbi.nlm.nih.gov/Traces/trace.cgi?cmd=show&f=formats&m=doc&s=formats

Bio.SeqIO.SffIO.ReadRocheXmlManifest(handle)

读取SFF“索引”中的任何罗氏风格XML清单数据。

sff文件格式允许多个不同的索引块,罗氏利用这一点定义了他们自己的索引挡路,它还嵌入了一个xml清单字符串。这不是SFF文件格式的公开文档扩展,这是反向工程。

该句柄应指向以二进制模式打开的SFF文件。此函数将使用句柄查找/告知函数,并将句柄留在任意位置。

找到的任何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对象)。

  • 源-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
parse(handle)

开始解析文件,并返回SeqRecord生成器。

iterate(handle)

解析文件并生成SeqRecord对象。

__abstractmethods__ = frozenset({})
class Bio.SeqIO.SffIO.SffWriter(target, index=True, xml=None)

基类:SequenceWriter

SFF文件编写器。

__init__(target, index=True, xml=None)

初始化SFF编写器对象。

参数:
  • 目标-以二进制模式打开的输出流,或文件的路径。

  • 索引-布尔参数,我们是否应该尝试编写索引?

  • xml-可选字符串参数,要记录在索引挡路中的xml清单(有关读取此数据,请参阅函数ReadRocheXmlManifest)。

write_file(records)

使用此选项可以写入包含给定记录的整个文件。

write_header()

写入SFF文件头。

write_record(record)

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

这假设标头已经完成。