跳转至

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.OutOfMemoryErrorJava 内存不足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