本文由 Juse 基于以下资料进行撰写:

How to extract uniquely mapped reads from bam/sam produced by bwa-mem? from SEQanswers

Obtaining uniquely mapped reads from BWA mem alignment (filtering by q score does not seem to do the trick in my case) from Biostars

Obtaining uniquely mapped reads from BWA mem alignment from StackExchange

在此感谢 community 中各位大佬的无私分享,关于 SAM format 的详细说明可见:

https://samtools.github.io/hts-specs/SAMv1.pdf

正文

在某些文章中,有时我们会看到作者提及到在后续分析中,ta 只考虑了 uniquely mapping reads(后文统称唯一比对)。从直觉上出发,使用唯一比对的思路不难理解 —— 这些比对更加精确,并使后续的分析具有更好的解释性。

目前来说,得到唯一比对的最主流方法是直接通过 MAPQ 进行过滤,但这并不能得到严格意义上的唯一比对,因为部分 reads 在经过该过滤后仍然具有多重比对。不过这里需要明确一点:通过 MAPQ 过滤后仍存在的多重比对数量其实已经很少,如 Biostars 中的帖主所示:

For the one sample I am using to test out commands, I filtered my data so I only have properly paired reads and mapped reads (in the case of my unpaired reads) and also filtered by q score (I get nearly the same results at q of 10, 20, or 30, so it's not an issue of changing the q score level), merged all my bam files, and obtained 193,998 reads total for that sample. When I open the bam file in Geneious and count the number of reads for each locus they add up to 194, 050. I realize the difference between these two numbers is an incredibly small number of reads.

因此,仅使用 MAPQ 进行过滤看上去也是可行的(如果你能接受极小一部分 “可能具有多个比对” 的 reads)。并且严格意义上说,唯一比对这一概念本身就具有局限性 —— 比对时所使用的参数如果过于宽松,那么具有多重比对的 reads 数量也会大大增加。

不过,如果实在想要避免多重比对带来的影响,可以根据 bwa 比对中的一些 Alignment Tags 来进行过滤,在 bwa 中,拥有多重比对的 reads 会出现以下一些 Tag:

  • XA,该 flag 中描述了对应 read 的 Alternative hits。
  • SA,该 flag 用于标识嵌合的比对结果(Supplementary Alignment)。

这两个 flag 的格式非常相似,其中 [XA] 是 bwa 等一部分比对软件使用的 flag。更详细信息可见下文说明。

因此,如果要过滤出唯一比对,只需要对这两个 flag 进行筛选

1
$ sambamba view -t 12 -h -f bam -F "mapping_quality >= 1 and not (unmapped or secondary_alignment) and not ([XA] != null or [SA] != null)" [input bam] -o [output bam]

sambamba -F 中的各个 filter tag 说明:

  • mapping_quality >= 1:要求比对质量分数至少为 1。
  • not (unmapped or secondary_alignment):不满足 unmapped 或 secondary_alignment 条件。
    • unmapped:未比对上的 reads。
    • secondary_alignment:同一 read 除了主比对之外的次比对记录。
  • not ([XA] != null or [SA] != null):不存在 [XA] tag 或 [SA] tag。
    • [XA]:当 read 完整地比对到了多个位置时,比对软件会选择最佳的一个作为 primary (主比对),其他的标记为 secondary (次比对)。而 [XA] 和 secondary_alignment 的区别在于前者在主比对记录中进行次比对结果的标注,后者则将次比对结果进行单独记录。相比之下,[XA] 能够节省存储空间。
    • [SA]:指 read 的不同部分比对到了不同的位置,可能由结构变异、基因融合、错误组装等因素导致。

以上过滤使用的 filter tag 可根据自身需求进行灵活调整,上述命令将过滤未比对的 reads保留有且仅有唯一比对位置的 reads