Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶
sam格式很精炼,几乎包含了比对的所有信息,我们平常用到的信息很少,但特殊情况下,我们会用到一些较为生僻的信息,关于这些信息sam官方文档的介绍比较精简,直接看估计很难看懂。
今天要介绍的是如何通过bam文件统计比对的indel和mismatch信息
首先要介绍一个非常重要的概念--编辑距离
定义:从字符串a变到字符串b,所需要的最少的操作步骤(插入,删除,更改)为两个字符串之间的编辑距离。
(2016年11月17日:增加,有点误导,如果一个插入有两个字符,那编辑距离变了几呢?1还是2?我又验证了一遍:确实是2)
这也是sam文档中对NM这个tag的定义。
编辑距离是对两个字符串相似度的度量(参见文章:Edit Distance)
举个栗子:两个字符串“eeba”和“abca”的编辑距离是多少?
根据定义,通过三个步骤:1.将e变为a 2.删除e 3.添加c,我们可以将“eeba”变为“abca”
所以,“eeba”和“abca”之间的编辑距离为3
回到序列比对的问题上
下面是常见的二代比对到ref的结果(bwa):
D00360:96:H2YLYBCXX:1:2110:18364:84053 353 seq1_len154_cov5 1 1 92S59M8I17M1D6M1D67M seq30532_len2134_cov76 1 0 AAAAAAAAAAAAAAAAAAAAAAAACCCTGTCTCTAATAAAATACAAACAATTAGCCGGGCATGGTGGCACGCGCCTTTAGTCCCAGCTACTAGGGAGGCTGAGGCAGGGGAATTGTTTGAACCCGGGAGGTGGAGGTTGCAGTGAGCGGAGTTTTTTTCACTGCACTCCAGCCTGGTGACAAATCAAAAATCCATTTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAACAAA
DDDDDHIIIIIIII<EHHII?EHH0001111111<11<DEH1D1<FH1D<<<C<@GEHD</<11<101<1D<<C<E0D11<<1<D?1F1CC1DE110C0D1011100////0DD<1=@1=FGHCDHH<FG<D0<<<EF?CE<00<<0<D//0;<:D/;///;8F.;/.8.8......88.9........-8BBGADHIIHD?>D?HH<,>=HHDD,5CHDCDHD><,,,--8----8-8-- NM:i:25 MD:Z:16A21C16C0A3T15^A6^G1G0T0G3C2T0G1C41A4A2A3 AS:i:49 XS:i:42 SA:Z:seq13646_len513_cov63,125,-,103S125M21S,1,11; RG:Z:chr22
这是ref序列
>seq1_len154_cov5 GGGAGGCTGAGGCAGGAGAATTGTTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCAAGATTGCACTCCAGCCTGGATGACAAGAGTGAAACTCTGTCTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
cigar字段包含了序列比对的简化信息,M(匹配比对,包含match和mismatch),=(纯match),X(纯mismatch),I(插入),D(删除),还有N、P和S、H。(注:目前只在blasr比对结果中见过=和X)
根据cigar字段可以统计indel信息,但是无法统计mismatch。
这个时候就可以用到NM tag了,mismatch = NM – I - D = 25 – 8 – 1 – 1 = 15
有兴趣的可以对着cigar数一遍,下面是我无聊数着的结果,也是15个
使用python的pysam模块可以很容易的提取出每个比对结果的NM信息
参见之前的帖子:pysam - 多种数据格式读写与处理模块(python)
再次验证一遍:证明NM=len(mismatch) + len(insertion) + len(deletion), 而不是 count(mismatch) + count(insertion) + count(deletion) (count的意思是三个碱基的insertion算一个)
>>> bam_file = pysam.AlignmentFile(infile, "rb") >>> for line in bam_file: ... if 300 < line.query_alignment_length < 500: ... break ... >>> line.query_alignment_length 321 >>> line.seq 'CTCTTCATCACGTCACTTGTCCATGTCAATGGCTACAGGTTGGAAGTTTGGCCGCGGAGGGTGGGCAGGCAAGAGAAAGAAATCAGATAGGGCAGATGGTAGGGTAAAAGGAGGGGGTTAAGTGCAAATTGTCTACTGTTTGCAAATGGGAAGCATGTGATTGTTAAAATTTATACGATAAACCTTCTCATCATGTTGAGTCTCATGCTTGCGCCAAGAAGATCGGGTTCGGCGGGTCAAGCTGATAAGCAACTTGGGCAGCAAAGTCGTTCAGTGATACAAAATCATGTGCAAAAATCACAAGCATTCTTATAAACACCA' >>> line.cigarstring '5148H3M1I2M1I4M2I3M3I3M1D2M1I4M3I1M1I4M1D10M1D5M4I4M3D1M3I18M1I1M1I1M1I4M4D2M1I2M2I4M2I4M1I4M5I4M1I9M1I14M3I1M1I2M2I7M2I7M3I2M1I5M2I1M1I2M1I1M1I4M5I3M1I2M3I1M1I4M4I3M4I2M2I1M3I19M3I10M2I4M1I11M1D27M2I6M25212H' >>> line.reference_name 'Backbone_1' >>> line.reference_start 7164 >>> line.reference_end 7413 >>> line.get_tag('NM') 100
取出了一条长度适中的比对结果,cigar字段比较全面。
取出了比对上的ref:
>>> ref = 'CTCTCTCACCACTCCTATTCAACACAGTGTTGGAAGTTCTGGACAGGGCAATCAGGCAAGAGAAAGAAATAAAGGGTATTCAATTAGGAAAAGAGGAAGTCAAATTGTCCCCGTTTGCAGATGACATGATTGTATATTTAGAAAACCCCACTGTTTCAGCCCCAAATCTCCTTAAGCTGATAAGCAACTTCAGCAAAGTCTCAGGATACAAAATCAATGTGCAAAAATCACAAGCATTCTTATACACCA'
先通过我自己写的cigar校正函数校正:
def formatSeqByCigar(seq, cigar):'''Input: query_alignment_sequence and cigar from sam fileOutput: formatSeqPurpose: make sure the pos is one to one correspondence(seq to ref)'''formatSeq = ''pointer = 0; qstart = 0; qend = -1; origin_seq_len = 0if cigar[0][0] == 4 or cigar[0][0] == 5:qstart = cigar[0][1]if cigar[-1][0] == 4 or cigar[-1][0] == 5:qend = - cigar[-1][1] - 1 # fushu countfor pair in cigar:operation = pair[0]cigar_len = pair[1]if operation == 0: # 0==MformatSeq += seq[pointer:(pointer+cigar_len)]pointer += cigar_lenorigin_seq_len += cigar_lenelif operation == 1: # 1==Ipointer += cigar_lenorigin_seq_len += cigar_lenelif operation == 2: # 2==DformatSeq += 'D'*cigar_lenelif operation == 4 or operation == 5: # 5==Horigin_seq_len += cigar_lencontinueelse:print (cigar)raise TypeError("There are cigar besides S/M/D/I/H\n")return formatSeq, qstart, qend, origin_seq_len
然后分别计算deletion和mismatch:
>>> i = 0 >>> count = 0 >>> while i < len(ref):if formatSeq[i] != ref[i]:count += 1i += 1>>> count 17 >>> formatSeq.count('D') 11
可以看出deletion有11个,退出mismatch有6个。
随手一推insertion有83个。
而
>>> cigarstring = '5148H3M1I2M1I4M2I3M3I3M1D2M1I4M3I1M1I4M1D10M1D5M4I4M3D1M3I18M1I1M1I1M1I4M4D2M1I2M2I4M2I4M1I4M5I4M1I9M1I14M3I1M1I2M2I7M2I7M3I2M1I5M2I1M1I2M1I1M1I4M5I3M1I2M3I1M1I4M4I3M4I2M2I1M3I19M3I10M2I4M1I11M1D27M2I6M25212H' >>> cigarstring.count('I') 41 >>> cigarstring.count('D') 6
用count计算显然不对。
验证成功
真切的明白了计算机有多么伟大,如果要是你肉眼去比对去数的话,我估计你会立马崩溃。
Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶相关推荐
- NGS数据分析实践:03. 涉及的常用数据格式[2] - sam/bam格式
NGS数据分析实践:03. 涉及的常用数据格式[2] - sam/bam格式 2. sam和bam格式 系列文章: 二代测序方法:DNA测序之靶向重测序 NGS数据分析实践:00. 变异识别的基本流程 ...
- sam/bam格式说明
在生物信息学中尤其是高通量测序数据分析中,大部分的操作都是在实现短片段序列与参考序列的比对(mapping),比如bowtie等,这就涉及到如何使用一个统一的格式来表示这种mapping结果呢,sam ...
- SAM/BAM相关的进阶知识
1. samtools和picard的排序问题 samtools和picard都有对SAM/BAM文件进行排序的功能,一般都是基于坐标排序(还提供了-n选项来设定用reads名进行排序),先是对chr ...
- [leetcode] 72.Edit Distance 编辑距离-史前最简明清晰的解答
题目: 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 输入: ...
- linux bam文件格式,pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)...
在开发基因组相关流程或工具时,经常需要读取.处理和创建bam.vcf.bcf文件.目前已经有一些主流的处理此类格式文件的工具,如samtools.picard.vcftools.bcftools,但此 ...
- NGS数据格式梳理02-SAM/BAM格式最详细解读
本篇是自己学习SAM和SAMtag的资料心得,参考资料(文中"[ ]"中的数字对应文末的参考文献)都有加上. 全网最全介绍SAM|BAM文件文章. 写作时间:2020.05. 本文 ...
- pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)--转载...
pysam 模块介绍!!!! http://pysam.readthedocs.io/en/latest/index.html 在开发基因组相关流程或工具时,经常需要读取.处理和创建bam.vcf.b ...
- stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)
I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...
- 字符串编辑距离(Edit Distance)
一.问题描述 定义 字符串编辑距离(Edit Distance),是俄罗斯科学家 Vladimir Levenshtein 在 1965 年提出的概念,又称 Levenshtein 距离,是指两个字符 ...
最新文章
- 20180517早课记录12-Hadoop
- Python函数式编程-map()、zip()、filter()、reduce()、lambda()
- 【模拟】牛客网:区间表达
- [AX]AX2012 帮助服务
- 《Hadoop实战(第2版)》迷你书
- Go语言之 下载安装及第一个代码
- 移动端产品比较分析:APP、小程序、H5
- 抖音直播间弹幕发言采集工具
- STM32F1读取MLX90614ESF非接触式温度传感器
- 4227. 【五校联考3day2】B (Standard IO)
- T-Code (Controlling)
- 【SCIR笔记】多模态摘要简述
- 如何增加架设传奇服务器
- tf.nn.batch_normalization() 和 tf.layer.batch_normalization()
- 中国红薯淀粉市场供需现状调研及前景策略分析报告2022年版
- 如何高效学习英语?这个方法你一定要知道
- 运营入门——全栈市场人
- int 等数据类型的含义
- 数据库 SQL 高级用法
- 第1章 用物理模型进行高效的水模拟