跳转至

fastp 数据预处理

fastp 是一款全能型 FASTQ 数据预处理工具,一次扫描完成质控、去接头、质量修剪、过滤、去重等所有操作,速度比 Trimmomatic 快 9 倍,已成为最主流的测序数据预处理工具。

核心知识点

知识点说明
工具定位FASTQ 数据一站式质控与预处理工具
最新版本fastp 1.0(2025 年发表 iMeta 论文)
开发者陈世峰(OpenGene)
语言实现C++ 实现,多线程支持
核心优势一次扫描完成所有操作、自动检测接头、生成 HTML 报告
速度对比比 Trimmomatic 快约 9 倍
输出格式FASTQ 文件 + JSON 报告 + HTML 报告
特色功能自动接头检测、UMI 处理、去重、polyG/polyX 去除

安装配置

方法一:Conda 安装(推荐)

conda install -c bioconda fastp   # 安装 fastp
fastp --version                    # 查看版本

方法二:预编译二进制

# 下载预编译版本(极简安装)
wget http://opengene.org/fastp/fastp   # 下载可执行文件
chmod a+x fastp                         # 添加执行权限
sudo mv fastp /usr/local/bin/           # 移到系统路径

方法三:从源码编译

git clone https://github.com/OpenGene/fastp.git  # 克隆源码
cd fastp                                          # 进入目录
make -j 8                                         # 多线程编译
sudo make install                                 # 安装到系统

基本使用

1. 双端数据预处理(最常用)

# 一条命令搞定所有预处理
fastp \
  -i raw_R1.fq.gz \              # 输入正向读长
  -I raw_R2.fq.gz \              # 输入反向读长
  -o clean_R1.fq.gz \            # 输出质控后正向读长
  -O clean_R2.fq.gz \            # 输出质控后反向读长
  -w 8 \                         # 工作线程数
  -j sample_fastp.json \         # JSON 格式报告
  -h sample_fastp.html           # HTML 格式报告(浏览器查看)

# fastp 会自动完成:
# 1. 质量过滤(默认 Q15)
# 2. 接头检测和去除(自动检测,不需要指定接头文件!)
# 3. 去除 polyG 尾巴(NovaSeq/NextSeq 数据自动开启)
# 4. 长度过滤(默认去除 < 15bp 的读长)
# 5. 生成 before/after 质控报告

2. 单端数据预处理

# 单端数据
fastp \
  -i input.fq.gz \               # 输入
  -o output.fq.gz \              # 输出
  -j report.json \               # JSON 报告
  -h report.html                 # HTML 报告

3. 自定义质控参数

# 更严格的质控参数
fastp \
  -i R1.fq.gz -I R2.fq.gz \
  -o clean_R1.fq.gz -O clean_R2.fq.gz \
  -q 20 \                        # 质量阈值提高到 Q20(默认 Q15)
  -u 40 \                        # 低质量碱基超过 40% 则丢弃该读长
  -n 5 \                         # N 碱基超过 5 个则丢弃
  -l 50 \                        # 最短长度 50bp(默认 15)
  --cut_front \                  # 从 5' 端切除低质量碱基
  --cut_tail \                   # 从 3' 端切除低质量碱基
  --cut_window_size 4 \          # 滑窗大小
  --cut_mean_quality 20 \        # 滑窗平均质量阈值
  -w 16 \                        # 16 线程
  -j report.json -h report.html

高级用法

1. 去重(Deduplication)

# 启用去重功能(v0.22.0+)
fastp \
  -i R1.fq.gz -I R2.fq.gz \
  -o dedup_R1.fq.gz -O dedup_R2.fq.gz \
  -D \                            # 启用去重(--dedup)
  --dup_calc_accuracy 3 \         # 去重精度(1-6,越高越准但越慢)
  -j dedup.json -h dedup.html

# 注意:去重会增加内存消耗
# 精度等级 3 适合大多数场景

2. UMI 处理

# 处理带 UMI(Unique Molecular Identifier)的数据
fastp \
  -i R1.fq.gz -I R2.fq.gz \
  -o umi_R1.fq.gz -O umi_R2.fq.gz \
  --umi \                         # 启用 UMI 模式
  --umi_loc per_read \            # UMI 位置(per_read/per_index/...)
  --umi_len 8 \                   # UMI 长度
  --umi_prefix UMI                # UMI 标签前缀

3. PolyG 和 PolyX 处理

# NovaSeq/NextSeq 数据会产生 polyG 尾巴
# fastp 默认会检测并去除 polyG

# 手动控制 polyG 处理
fastp \
  -i R1.fq.gz -I R2.fq.gz \
  -o out_R1.fq.gz -O out_R2.fq.gz \
  --trim_poly_g \                 # 强制开启 polyG 去除
  --poly_g_min_len 10 \           # 最小 polyG 长度(默认 10)
  --trim_poly_x \                 # 去除所有 polyX(polyA/T/C/G)
  --poly_x_min_len 10             # 最小 polyX 长度

4. 碱基校正(Overlap 分析)

# 双端数据可以利用重叠区域校正碱基错误
fastp \
  -i R1.fq.gz -I R2.fq.gz \
  -o corrected_R1.fq.gz -O corrected_R2.fq.gz \
  --correction \                  # 启用碱基校正
  --overlap_len_require 30 \      # 要求最少 30bp 重叠
  --overlap_diff_limit 5          # 重叠区最多允许 5 个差异碱基

5. 批量处理 + MultiQC 整合

#!/bin/bash
# batch_fastp.sh - 批量 fastp 预处理

RAWDIR="raw_data"
CLEANDIR="clean_data"
REPORTDIR="fastp_reports"
THREADS=16

mkdir -p $CLEANDIR $REPORTDIR

for R1 in $RAWDIR/*_R1.fq.gz; do
    SAMPLE=$(basename $R1 _R1.fq.gz)
    R2=${R1/_R1/_R2}

    echo "处理中: $SAMPLE"

    fastp \
      -i $R1 -I $R2 \
      -o ${CLEANDIR}/${SAMPLE}_R1.fq.gz \
      -O ${CLEANDIR}/${SAMPLE}_R2.fq.gz \
      -w $THREADS \
      -j ${REPORTDIR}/${SAMPLE}.json \    # JSON 报告(MultiQC 会识别)
      -h ${REPORTDIR}/${SAMPLE}.html \    # HTML 报告
      -q 20 -l 50 \                       # 质量和长度阈值
      --cut_front --cut_tail \             # 两端修剪
      --cut_mean_quality 20               # 滑窗质量
done

# 用 MultiQC 汇总所有 fastp 报告
multiqc $REPORTDIR/ -o multiqc_fastp/ -n "fastp质控汇总"

echo "全部处理完成"

6. 并行批量处理

# 使用 fastp 自带的 parallel.py 脚本
# 自动配对双端文件并并行处理
python parallel.py \
  -i raw_data/ \               # 输入目录
  -o clean_data/ \             # 输出目录
  -t 4                         # 同时处理 4 个样本

常见报错与解决

报错信息原因解决方法
ERROR: R1 and R2 have different number of readsR1/R2 文件不配对seqkit pair 或 BBTools repair.sh 修复
cannot open file文件路径错或权限不够检查文件路径和权限
内存溢出去重模式消耗大量内存降低 --dup_calc_accuracy 或关闭去重
质控后读长数量太少质控参数太严格降低 -q 阈值和 -l 最短长度
JSON 报告为空输入文件为空检查输入文件 zcat R1.fq.gz | head
--dont_overwrite 报错输出文件已存在删除已有输出或不使用该参数

速查表

# ===== fastp 速查表 =====

# 安装
conda install -c bioconda fastp        # conda 安装
wget http://opengene.org/fastp/fastp   # 直接下载

# 基本双端预处理
fastp -i R1.fq.gz -I R2.fq.gz \
  -o clean_R1.fq.gz -O clean_R2.fq.gz \
  -j report.json -h report.html

# 严格质控
fastp -i R1.fq.gz -I R2.fq.gz \
  -o clean_R1.fq.gz -O clean_R2.fq.gz \
  -q 20 -l 50 \
  --cut_front --cut_tail --cut_mean_quality 20

# 去重
fastp -i R1.fq.gz -I R2.fq.gz \
  -o dedup_R1.fq.gz -O dedup_R2.fq.gz -D

# 常用参数
# -i/-I        输入 R1/R2
# -o/-O        输出 R1/R2
# -w N         工作线程数
# -q N         质量阈值(默认15)
# -l N         最短长度(默认15)
# -n N         最大N碱基数
# -D           去重
# --cut_front  5'端修剪
# --cut_tail   3'端修剪
# --trim_poly_g  去polyG
# --trim_poly_x  去polyX
# --correction   碱基校正
# --umi          UMI模式
# --adapter_sequence  手动指定接头(通常不需要)

# fastp vs Trimmomatic
# fastp:自动接头检测,速度快9倍,C++实现
# Trimmomatic:需手动指定接头,Java实现,参数更细