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 reads | R1/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实现,参数更细