从零开始完整学习全基因组测序数据分析: Trimmomatic、SOAPnuke、sickle和seqtk的比较

流过昼夜 提交于 2021-02-13 06:40:16

在第4节开始之前,先来一段插曲。在上一节中,我们说到可以使用Trimmomatic、sickle、seqtk或者SOAPnuke对fastq数据进行过滤。那么也许你会好奇,那他们都有什么特点,都一样好吗或是有哪些差异之处?正所谓,工欲善其事必先利其器,所以这篇文章将会与你一起来解开这几个问题。


因为Trimmomatic的安装已经在第3节 数据质控中说的比较清楚了,这里就不再赘述。那么,先说SOAPnuke的安装,你有两种方式:


第一,确保你的系统中有automake。由于SOAPnuke还使用了多个第三方的c++ 程序库,包括 但不限于 : boost,log4cplus和openssl。因此,需要在你的系统中先安装好这几个库,并修改SOAPnuke代码包的CMakeLists.txt,重新指定里面这几个程序包的路径。同时还需要把上述包的include目录链接到CMakeList.txt中指定的目录(或者你也可以修改到其他目录)下。此外,如果上述三个包的静态库没在默认路径下,那么。。。你还得找到它们,然后修改路径,并涉及到少量代码的修改,再进行编译,然后祈祷。。。至于第三方程序库的安装方法都可以在网上找到。但特别指出一点,建议使用源码安装(特别是log4cplus),防止有些包默认不产生静态链接库。另外,版本不对也会报各种error,包括编译器的error,这里就不一一展开了。总之,如果没有一波N折.......那真是有鬼了,继续祈祷, 祝你成功


第二种,在公众号后台回复SOAPnuke,提供编!译!好!的!可执行版本(Linux给大家,另外还包含了本系列中使用到的数据和相关代码(更新中),你值得拥有。


接着,安装另外两个适合用来切除read 末尾低质量碱基的软件:[sickle]()和[seqtk]()。其中seqtk是bwa和samtools的作者Heng Li所编写的fq/fa序列处理工具,修剪read末尾低碱基只是其中一个功能(还包含了其他几个有用的功能);sickle比较专注,就只干低质量碱基切除这个事。这两个软件的安装都非常容易,可以直接从github上将源码下载下来编译,如果你用的是Mac电脑上还可以直接通过Homebrew安装,如:

$ brew install sickle
$ brew install seqtk
这四个工具都安装完成之后,我们就可以开始了。 下面我以第2节提到的 untreated.fq为 例子。


为了适合做比较,如无特殊说明,我们都以相同的标准对数据进行过滤。


首先是Trimmomatic:

$ java -jar ../../tools/Trimmomatic/trimmomatic-0.36.jar SE \
       -phred33 -trimlog untreated.logfile \
       raw_data/untreated.fq \
       u.trimmomatic.fq \
       SLIDINGWINDOW:5:20 LEADING:5 TRAILING:5 MINLEN:20
由于untreated.fq只有一份文件,就当作是Single End测序的数据来对待,因此我选择SE模式。质量值体系选择-phred33。这里再强调一次, 目前基本上所有的NGS测序数据都是Phred33质量值体系,包括illumina HiSeq X10、NovaSeq等所有HiSeq 2500 之后(包括HiSeq 2500)推出的测序平台 ;质量判定窗口长度设定为5,窗口中碱基平均质量阈值为20( SLIDINGWINDOW:5:20 );read首尾碱基切除的质量阈值为5( LEADING:5 TRAILING:5 );过滤后最小read长度为20bp,如果低于则丢弃。


然后是SOAPnuke,这个和Trimmomatic一样,能够通过局部比对去除fq序列中测到的adapter序列,但是不会切除read末端低质量序列,而是通过设定低质量碱基数目比例的阈值来进行过滤。它的这种过滤方法有一定的缺陷,我们下文会说到。现在我们先完成例子:

$ ~/software/com_extra/SOAPnuke/SOAPnuke1.5.6 filter -l 20 -G -Q 2 -1 untreated.fq -C u.soapnuke.fq.gz -o ./

SOAPnuke filter的参数是比较多的,我们这里挑其中几个最重要的来说说:

  • -l 判定低质量碱基的阈值,它默认是5。我们这里为了保持和Trimmomatic的一致,同样设置为20;

  • -G 参数,如果设置了就表示质量值体系选择为phred33,默认是phred64。这是一个值得注意的地方,因为在SOAPnuke中是用sanger和illumina这两个词来分别代表phred33和phred64质量体系的。之所以会这样其实开发该软件的历史原因,在比较早期的时候,phred33和phred64这两个词用的还比较少。开发人员知道的是sanger测序的质量值是ASCII-33,而illumina的质量值要-64(早期版本),因此为了好记,就直接用了这两个词,代表和sanger的一样,或者和illumina的一样;

  • -Q 参数用于指明我们过滤后输出的read要选用哪种质量值体系输出,1代表phred64,2代表phred33,默认依然是phred33。SOAPnuke中的文档用的也依然是illumina和sanger作为不同质量值体系的标识;

  • -1 参数用于接输入的read1,相应的还有一个 -2 参数,用于接入read2,这是对于Pair-End测序而言的,我们这里只有一个fq,因此使用 -1 就可以了。

  • -C是输出文件的名字。SOAPnuke总是会输出gz压缩的文件,如果文件名中没有.gz,那么会被自动加上,如果没有指定这个-C参数,那么输出的文件会在原来输入文件的前面加上Clean_前缀;

  • -o 参数用于指定输出目录,默认是当前程序的运行目录;我们这里指定为当前目录;


SOAPnuke还有其它几个有用的参数,包括:-n代表一条read中可以允许多大比例的N;-d代表是否要去除PCR过程产生的重复序列,-q用于调整低质量碱基所占比例等等;此外,SOAPnuke还会在结果目录下同时输出其他几份文件,用于记录一下过滤前后的质量信息,由于本文中不会用到它们就不一一细说了。


接下来是sickle:

$ sickle se -f raw_data/untreated.fq -t sanger -o u.sickle.fq

SE input file: raw_data/untreated.fq

Total FastQ records: 250000FastQ records kept: 249742FastQ records discarded: 258

这里的fastq输入文件通过 -f 参数传入,输出结果通过 -o 参数指定。需要重点注意的是 -t 参数,这里需要明确指定fastq具体的质量值体系( 详见第2节 )。sickle能够处理所有三种不同的质量值体系: solexa Phred64,illumina Phred64 和 Phred33 ,这里的sanger指的就是phred33,我认为这个叫法和SOAPnuke的质量值体系命名是一样的原因!


最后是seqtk,修剪低质量碱基的功能模块是 trimfq,默认情况下只需直接给定一个fastq输入文件就行了,结果会直接输出到屏幕,这里我们将其重定向到一份新的输出文件中:

$ seqtk trimfq raw_data/untreated.fq > u.trimfq.fq


seqtk trimfq的功能比较单一,只能处理phred33,其他的都不行,参数很简洁。


【注意】 sickle和seqtk trimfq都不能用于adapter序列的切除,它们没有这个功能。


结果比较

现在我们来比较一下这四个修剪之后的结果。由于数据比较少,这里我打算直接用R来完成这个任务,如果是比较大量的数据,还是建议用python/perl/java/c++/c等。


在开始之前,我们还需要再安装一个R包——qrqc来分析这个数据并进行画图可视化。 qrqc是Bioconductor这个大包中的一个部分,适合用于我们这个任务的分析。它的安装也很容易,在终端运行R,然后输入以下语句即可,注意如果发现不支持"https://"的话,可以尝试使用“http://”:

> source("https://bioconductor.org/biocLite.R")
> biocLite("qrqc")

这里我用qrqc包来分析read各个位置上的质量值分布情况,并用ggplot2将其展示出来,代码如下:

library(qrqc)

# 指定fastq文件路径
fq_files = c(rawdata="raw_data/untreated.fq",             trimmomatic="u.trimmomatic.fq",             soapnuke="u.soapnuke.fq",             sickle="u.sickle.fq",             seqtk_trimfq="u.trimfq.fq")

# Load each fastq file in by using qrqc's readSeqFile
seq_read = lapply(fq_files, function(file) {  readSeqFile(file, hash = FALSE, kmer = FALSE) }) quals = mapply(function(sfq, name) {  qs = getQual(sfq)  qs$trimmer = name  qs }, seq_read, names(fq_files), SIMPLIFY = FALSE) d = do.call(rbind, quals)

# 画图
library(ggplot2) position = d$position mean = d$mean trimmer = d$trimmer p1 = qplot(position, mean, color=trimmer, geom=c("line", "point"))
p1 = p1 + ylab("Mean quality (Phred33)") + theme_bw() print(p1) p2 = qualPlot(seq_read, quartile.color = NULL, mean.color = NULL) + theme_bw() p2 = p2 + scale_y_continuous("Quality (Phred33)") print(p2)
这段代码接受5个输入文件,一份原始的fastq和其他4份修剪过后的fastq,并输出两幅图:图1和图2。在图1中,横轴是read的位置,纵轴是各位置上的平均质量值,我们可以看到越到read的末尾,质量会随着下降,特别是没做任何修剪的原始fastq,可以看出其末尾的碱基质量更差,这意味着错误率更高了。这里SOAPnuke比较亮。。。


图1. 


在图2中,我们同时对比了这5份文件的质量值分布情况,可以看出,无论是用Trimmomatic、sickle还是seqtk我们都将read末尾的低质量碱基成片切除了,末端的质量值范围也会被我们限制在了较高的区域,这可以确保下游分析过程不会过多地被低质量碱基所干扰,然鹅SOAPnuke!!!

图2.


小结


毫无疑问,从上面的比较结果中,我们可以明显发现,Trimmomatic最优,sickle次之,seqtk第三。当然,这其中结果最好的Trimmomatic丢弃掉的数据要比其他的略多(约1%~2%)。这三种里面比较特殊的是seqtk,它不丢弃任何read,只是将其截短,而且如果长度低于设定的最低read长度就不切除了,直接保留原数据。这也是为什么它相比于Trimmomatic和sickle而言质量要差的重要原因,可即便如此它们的结果其实相差并不多。反观SOAPnuke,不得不说SOAPnuke的过滤效果是最差的,几乎没什么效果


图3


这个图3中,我把SOAPnuke中低质量碱基占比的参数调得更加严格(20%)再和默认的50%相比,但发现改善并不特别明显。原因在于SOAPnuke并不切除read的末端低质量序列,而只是通过判断当read中低质量的碱基比例达到一定程度的时候整个read去除。但这种情况其实是不合理的,因为根据目前的测序原理,read的错误率会明显富集于末端区域,而前半部分的质量都会比较高,这种计算比例的方法并不能很好地反映这一现象。虽然我们可以通过设置更严格的参数,比如图3将低质量值碱基的占比从50%降为20%来改善,lowQual也可以设置得更高一些,来获得一些改善。但我想说的是,这种差别的根本原因源自于对末端低质量碱基序列的处理,SOAPnuke这种整体性统计的方法,并不能有针对性地处理这些碱基。在实际的操作要花更多的时间和精力对参数进行对比(影响最大的参数是-q低质量碱基占比),这不是一个高明的手段,远不如其他三个通过滑动窗口计算局部质量值的方式来得直接和灵敏。


综上,如果需要同时去除测序接头序列,那么建议使用Trimmomatic;如果只需过滤低质量碱基或者低质量read,可以选择Trimmomatic或sickle,有时sickle会更快一些,如果不愿意read被过滤掉而且质量值体系是phred33,那么可以选择seqtk。



------技术探索生命------

在这里与你分享专业而系统的NGS基因数据挖掘技术和方法

本文分享自微信公众号 - 碱基矿工(helixminer)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!