コンテキストを少し説明すると、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 文字ですが、CIGAR で 101 と報告された sam ファイルを作成する際のバグの可能性があります。いくつかの読み取りを失う余裕があり、現時点では sam ファイルを生成したソース コードにアクセスできないため、バグを見つけてアライメントを再実行する機会はありません。言い換えれば、先に進むには実用的な解決策が必要です (今のところ)。したがって、ヌクレオチドの文字列の長さを数え、それを CIGAR に登録されているものと比較し、「正常な」行を新しいファイルに保存する Python スクリプトを考案しました。
#!/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