Trimmomatic 质控
Trimmomatic 是一款经典的 Illumina 测序数据质控工具,能去接头、去低质量碱基、过滤短读长,是很多生信流程的标准预处理步骤,虽然逐渐被 fastp 替代,但在老流程中仍然广泛使用。
核心知识点
| 知识点 | 说明 |
|---|
| 工具定位 | Illumina NGS 数据质控与预处理工具 |
| 最新版本 | v0.40(Java 实现,需要 JDK 8+) |
| 开发团队 | Usadel Lab(Bioinformatics & Systems Biology) |
| 核心功能 | 去接头(adapter)、质量修剪、长度过滤 |
| 双端处理 | 自动维护 R1/R2 配对关系 |
| 接头检测 | Palindrome 模式(适合短片段)和 Simple 模式 |
| 输出文件 | 4 个文件(paired R1/R2 + unpaired R1/R2) |
| 替代工具 | fastp 更快更简单,但很多已有流程还在用 Trimmomatic |
安装配置
方法一:Conda 安装(推荐)
conda install -c bioconda trimmomatic # 安装 trimmomatic
trimmomatic -version # 查看版本
方法二:手动下载
# 下载 jar 文件
wget http://www.usadellab.org/cms/uploads/supplementary/Trimmomatic/Trimmomatic-0.40.zip
unzip Trimmomatic-0.40.zip # 解压
# 运行方式
java -jar Trimmomatic-0.40/trimmomatic-0.40.jar # 用 java -jar 运行
接头序列文件
# Trimmomatic 自带接头序列文件,安装后位于:
# Conda 安装:$CONDA_PREFIX/share/trimmomatic-0.40-*/adapters/
# 手动安装:Trimmomatic-0.40/adapters/
# 常用接头文件:
# TruSeq2-PE.fa TruSeq v2 双端
# TruSeq3-PE.fa TruSeq v3 双端
# TruSeq3-PE-2.fa TruSeq v3 双端(含额外序列)
# NexteraPE-PE.fa Nextera 双端
# TruSeq2-SE.fa TruSeq v2 单端
# TruSeq3-SE.fa TruSeq v3 单端
# 查找接头文件位置
ADAPTER_DIR=$(find $CONDA_PREFIX -name "adapters" -path "*/trimmomatic*" | head -1)
ls $ADAPTER_DIR # 列出所有可用的接头文件
基本使用
1. 双端数据质控(最常用)
# 双端 RNA-seq/WGS 数据质控
trimmomatic PE \
-threads 8 \ # 线程数
-phred33 \ # Phred33 质量编码(现代数据都是)
sample_R1.fq.gz \ # 输入正向读长
sample_R2.fq.gz \ # 输入反向读长
sample_R1_paired.fq.gz \ # 输出:通过质控的正向读长
sample_R1_unpaired.fq.gz \ # 输出:只有一端通过的正向读长
sample_R2_paired.fq.gz \ # 输出:通过质控的反向读长
sample_R2_unpaired.fq.gz \ # 输出:只有一端通过的反向读长
ILLUMINACLIP:TruSeq3-PE-2.fa:2:30:10:2:True \ # 去接头
LEADING:3 \ # 去除 5' 端质量 < 3 的碱基
TRAILING:3 \ # 去除 3' 端质量 < 3 的碱基
SLIDINGWINDOW:4:15 \ # 4碱基滑窗,平均质量 < 15 则截断
MINLEN:36 # 去除长度 < 36 的读长
2. 单端数据质控
# 单端数据质控
trimmomatic SE \
-threads 8 \ # 线程数
input.fq.gz \ # 输入文件
output.fq.gz \ # 输出文件
ILLUMINACLIP:TruSeq3-SE.fa:2:30:10 \ # 去接头
LEADING:3 \ # 去 5' 低质量
TRAILING:3 \ # 去 3' 低质量
SLIDINGWINDOW:4:15 \ # 滑窗质控
MINLEN:36 # 最短长度
3. 各修剪步骤详解
# ILLUMINACLIP:<接头文件>:<seed_mismatches>:<palindrome_threshold>:<simple_threshold>
# 参数含义:
# seed_mismatches = 2 种子比对允许的错配数
# palindrome_threshold = 30 回文模式匹配阈值
# simple_threshold = 10 简单模式匹配阈值
# 可选: :2:True 最小接头长度:保留两端
# LEADING:3 从 5' 端开始,质量 < 3 的碱基逐个去除
# TRAILING:3 从 3' 端开始,质量 < 3 的碱基逐个去除
# SLIDINGWINDOW:4:15 4碱基窗口从 5' 端滑动,窗口平均质量 < 15 则从该处截断
# MINLEN:36 修剪后长度 < 36bp 的读长直接丢弃
# CROP:150 强制将读长截断为 150bp
# HEADCROP:10 去除 5' 端前 10 个碱基
# MAXINFO:36:0.5 自适应修剪(平衡长度和质量)
高级用法
1. 批量处理脚本
#!/bin/bash
# batch_trimmomatic.sh - 批量 Trimmomatic 质控
RAWDIR="raw_data" # 原始数据目录
CLEANDIR="clean_data" # 质控后输出目录
THREADS=8 # 线程数
ADAPTER="TruSeq3-PE-2.fa" # 接头文件
mkdir -p $CLEANDIR
for R1 in $RAWDIR/*_R1.fq.gz; do
SAMPLE=$(basename $R1 _R1.fq.gz) # 提取样本名
R2=${R1/_R1/_R2} # R2 文件
echo "质控中: $SAMPLE"
trimmomatic PE \
-threads $THREADS \
$R1 $R2 \
${CLEANDIR}/${SAMPLE}_R1_paired.fq.gz \ # 配对通过
${CLEANDIR}/${SAMPLE}_R1_unpaired.fq.gz \ # 正向单独通过
${CLEANDIR}/${SAMPLE}_R2_paired.fq.gz \ # 配对通过
${CLEANDIR}/${SAMPLE}_R2_unpaired.fq.gz \ # 反向单独通过
ILLUMINACLIP:${ADAPTER}:2:30:10:2:True \
LEADING:3 \
TRAILING:3 \
SLIDINGWINDOW:4:15 \
MINLEN:36
echo "$SAMPLE 完成"
done
echo "全部质控完成"
2. 自定义接头序列
# 如果内置接头不匹配,可以自定义
# 创建自定义接头文件 custom_adapters.fa
cat > custom_adapters.fa << 'EOF'
>PrefixPE/1
AGATCGGAAGAGCACACGTCTGAACTCCAGTCA
>PrefixPE/2
AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT
EOF
# 使用自定义接头文件
trimmomatic PE \
-threads 8 \
R1.fq.gz R2.fq.gz \
out_R1_paired.fq.gz out_R1_unpaired.fq.gz \
out_R2_paired.fq.gz out_R2_unpaired.fq.gz \
ILLUMINACLIP:custom_adapters.fa:2:30:10
3. 不同建库方法的推荐参数
# TruSeq(标准 Illumina 建库)
ILLUMINACLIP:TruSeq3-PE-2.fa:2:30:10:2:True LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36
# Nextera(tagmentation 建库)
ILLUMINACLIP:NexteraPE-PE.fa:2:30:10:2:True LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36
# 严格质控(高质量需求)
ILLUMINACLIP:TruSeq3-PE-2.fa:2:30:10:2:True LEADING:5 TRAILING:5 SLIDINGWINDOW:4:20 MINLEN:50
# 宽松质控(不想丢太多数据)
ILLUMINACLIP:TruSeq3-PE-2.fa:2:30:10:2:True LEADING:3 TRAILING:3 SLIDINGWINDOW:4:10 MINLEN:25
常见报错与解决
| 报错信息 | 原因 | 解决方法 |
|---|
Error: Unable to detect quality encoding | 质量编码不明 | 加 -phred33 或 -phred64 |
Could not find adapter file | 接头文件路径错 | 用 find 查找接头文件位置 |
Exception in thread "main" java.lang.OutOfMemoryError | Java 内存不足 | 加 java -Xmx4g -jar trimmomatic.jar |
| 输出文件大小为 0 | 参数太严格,所有读长被过滤了 | 放宽 MINLEN 和 SLIDINGWINDOW 阈值 |
Unknown trimming step | 修剪步骤拼写错误 | 检查参数名大小写和拼写 |
| R1 和 R2 行数不匹配 | 上游文件有问题 | 用 repair.sh(BBTools)修复 |
速查表
# ===== Trimmomatic 速查表 =====
# 安装
conda install -c bioconda trimmomatic
# 双端质控(标准参数)
trimmomatic PE -threads 8 \
R1.fq.gz R2.fq.gz \
R1_paired.fq.gz R1_unpaired.fq.gz \
R2_paired.fq.gz R2_unpaired.fq.gz \
ILLUMINACLIP:TruSeq3-PE-2.fa:2:30:10:2:True \
LEADING:3 TRAILING:3 \
SLIDINGWINDOW:4:15 MINLEN:36
# 单端质控
trimmomatic SE -threads 8 \
input.fq.gz output.fq.gz \
ILLUMINACLIP:TruSeq3-SE.fa:2:30:10 \
LEADING:3 TRAILING:3 \
SLIDINGWINDOW:4:15 MINLEN:36
# 修剪步骤
# ILLUMINACLIP 去接头序列
# LEADING:N 去 5' 端质量<N 的碱基
# TRAILING:N 去 3' 端质量<N 的碱基
# SLIDINGWINDOW:W:Q W碱基窗口平均质量<Q则截断
# MINLEN:N 丢弃长度<N的读长
# CROP:N 截断为N碱基
# HEADCROP:N 去除前N个碱基
# Trimmomatic vs fastp 对比
# Trimmomatic:Java实现,成熟稳定,参数灵活
# fastp:C++实现,速度快9倍,自动检测接头
# 新项目建议用 fastp,老流程继续用 Trimmomatic