给你一些背景信息:我正在尝试将 sam 文件转换为 bam
samtools view -bT reference.fasta sequences.sam > sequences.bam
退出并出现以下错误
[E::sam_parse1] CIGAR and query sequence are of different length
[W::sam_read1] parse error at line 102
[main_samview] truncated file
违规行如下所示:
SRR808297.2571281 99 gi|309056|gb|L20934.1|MSQMTCG 747 80 101M = 790 142 TTGGTATAAAATTTAATAATCCCTTATTAATTAATAAACTTCGGCTTCCTATTCGTTCATAAGAAATATTAGCTAAACAAAATAAACCAGAAGAACAT @@CFDDFD?HFDHIGEGGIEEJIIJJIIJIGIDGIGDCHJJCHIGIJIJIIJJGIGHIGICHIICGAHDGEGGGGACGHHGEEEFDC@=?CACC>CCC NM:i:2 MD:Z:98A1A
我的序列长 98 个字符,但在创建 sam 文件时可能存在错误,在 CIGAR 中报告了 101。我可以让自己奢侈地丢失几次读取,并且我目前无法访问生成 sam 文件的源代码,因此没有机会寻找错误并重新运行对齐。换句话说,我需要一个务实的解决方案来继续前进(目前)。因此,我设计了一个 python 脚本来计算我的核苷酸字符串的长度,将其与 CIGAR 中注册的内容进行比较,并将“正常”行保存在一个新文件中。
#!/usr/bin/python
import itertools
import cigar
with open('myfile.sam', 'r') as f:
for line in itertools.islice(f,3,None): #Loop through the file and skip the first three lines
cigar=line.split("\t")[5]
cigarlength = len(Cigar(cigar)) #Use module Cigar to obtain the length reported in the CIGAR string
seqlength = len(line.split("\t")[9])
if (cigarlength == seqlength):
...Preserve the line in a new file...
如您所见,要将 CIGAR 转换为显示长度的整数,我正在使用模块CIGAR。老实说,我对它的行为有点警惕。在非常明显的情况下,这个模块似乎错误地计算了长度。是否有另一个模块或更明确的策略将 CIGAR 转换为序列的长度?
旁注:有趣的是,至少可以说,这个问题已被广泛报道,但在互联网上找不到实用的解决方案。请参阅以下链接:
https://github.com/COMBINE-lab/RapMap/issues/9
http://seqanswers.com/forums/showthread.php?t=67253
http://seqanswers.com/forums/showthread.php?t=21120
https://groups.google.com/forum/#!msg/snap-user/FoDsGeNBDE0/nRFq-GhlAQAJ