quasi-mapping是基于k-mers+Suffix Array。
salmon原文链接
什么是Suffix Array请点这里
quasi-mapping是由RapMap这篇文章提出来的

salmon quasi-mapping 原理解析

第一步:建立索引

如果有多个transcript,那将多个transcripts连起来用$分割。使用rank9b algorithm and data structure of Vigna 使得任意位置的匹配都能知道它来源于哪个transcript。
然后基于k-mer建立hash table。
hash table<kmer,SA interval>。
Suffix Array(T) :建立Transcriptome的后缀数组
SA interval :就是该kmer所对应的后缀数组区间。
如上图中,k=3,如果kmer :ATT 则图中最下面的部分就代表,ATT所对应的SA interval,也就是区间[b,e)。

第二步:比对

(1)我们从read开头出发,对于read的每一个kmer在hash table 中查找,如果有则将该kmer记为ki,i为kmer在read中的位置。如图中read中的ATT,在hash table中也能找到。然后我们就能得到SA interval。
(2)计算MMP(Maximum Mappable Prefix)最大映射前缀。就是图中蓝色虚线圈出来的部分。就是以ATT为前缀往后延伸最长匹配部分。
(3)通过LCP(longest common prefix)最长公共前缀。如图中红色圈出来的部分。
可能会出现|LCP(T[SA[b’] ] ,T[SA[e’−1] ] )) |>|MMPi|的情况,就是LCP比MMP长。也就是说,在几条transcript里,都是ATTGACTA,而read是ATTGAGTA。则认为这不是虚假的匹配,而是测序过程中出现了错误。
如果直接从read紧接的位置开始(1)则很有可能返回的结果相似或相同。因为如图下一个kmer就是TGG,然后查表返回的结果与ATT相同。所以受到kallisto的启发,选择跳过这些子串。
NIP(next informative position)下一个信息位置。l=NIP(MMPi)=|LCP(T[SA[b’] ] ,T[SA[e’−1] ] )) |+1。NIP定义为LCP长度加1。read的下一个查询位置为position = i +l -k。
重复以上步骤直到NIP>lr-k lr=len(read) 。
最后会生成一个查询的集合S={(q0,o0,[b0,e0) ),(q1,o1,[b1,e1) ),…} q:查询位置 o:匹配方向 [b,e):SA interval区间。 根据kallisto获得的灵感,对每一个命中的区间取交集。但这里与kallisto不同的是,这里取交集的时候分正向反向,kallisto是不区分的。

相关文章:

  • 2021-07-07
  • 2021-11-17
  • 2022-02-08
  • 2021-12-02
  • 2021-11-23
  • 2021-11-28
  • 2022-01-01
猜你喜欢
  • 2021-09-25
  • 2022-02-08
  • 2022-01-21
  • 2022-01-18
  • 2022-12-23
  • 2022-12-23
  • 2021-09-29
相关资源
相似解决方案