Picard 工具集
Picard 是 Broad Institute 开发的 BAM/VCF 文件操作工具集,是 GATK 变异检测流程的核心组件,最常用的功能是标记重复序列(MarkDuplicates)和收集比对统计指标。
核心知识点
| 知识点 | 说明 |
|---|
| 工具定位 | 高通量测序数据(BAM/CRAM/VCF)操作工具集 |
| 最新版本 | v3.2.0(修复了 CRAM 文件的严重 bug) |
| 开发团队 | Broad Institute |
| 语言实现 | Java(v3.0 起需要 Java 17) |
| 许可证 | MIT License |
| 核心功能 | 标记重复、收集指标、排序、合并、格式转换 |
| 与 GATK 关系 | GATK4 已内置 Picard 工具,可用 gatk MarkDuplicates |
| 输出格式 | BAM/CRAM/VCF + 各种指标报告文件 |
安装配置
方法一:Conda 安装(推荐)
conda install -c bioconda picard # 安装 picard
picard --version # 查看版本
# 注意:conda 安装后用 picard 命令直接调用
# 不需要 java -jar picard.jar
方法二:下载 JAR 文件
# 从 GitHub 下载最新 jar
wget https://github.com/broadinstitute/picard/releases/download/3.2.0/picard.jar
# 运行方式
java -jar picard.jar --version # 查看版本
# 建议设置别名
alias picard="java -jar /path/to/picard.jar"
方法三:通过 GATK4 使用
# GATK4 已经内置了 Picard 的所有工具
conda install -c bioconda gatk4 # 安装 GATK4
gatk MarkDuplicates --version # 用 gatk 命令调用 Picard 工具
基本使用
1. 标记重复序列(MarkDuplicates)—— 最常用
# PCR 扩增会产生重复序列,必须标记(或去除)
picard MarkDuplicates \
I=sorted.bam \ # 输入:排序后的 BAM 文件
O=dedup.bam \ # 输出:标记重复后的 BAM
M=dup_metrics.txt \ # 输出:重复统计报告
REMOVE_DUPLICATES=false \ # false=标记不删除(推荐),true=删除重复
VALIDATION_STRINGENCY=LENIENT # 放宽验证(避免因格式小问题报错)
# 查看重复率
grep -A 1 "LIBRARY" dup_metrics.txt # 查看重复率等统计
# PERCENT_DUPLICATION 列就是重复率
# 一般 WGS 重复率 10-30% 是正常的
2. 收集比对统计(CollectAlignmentSummaryMetrics)
# 收集详细的比对质量统计
picard CollectAlignmentSummaryMetrics \
R=ref.fa \ # 参考基因组
I=sorted.bam \ # 输入 BAM
O=alignment_metrics.txt # 输出统计报告
# 报告包含:总读长数、比对率、配对率、错配率等
3. 收集插入片段大小分布
# 分析双端数据的插入片段大小分布
picard CollectInsertSizeMetrics \
I=sorted.bam \ # 输入 BAM
O=insert_size_metrics.txt \ # 文本报告
H=insert_size_histogram.pdf # 直方图(PDF)
# 正常 WGS 插入片段约 300-500bp
# 如果分布异常可能是建库问题
4. 添加 Read Group 信息
# 如果比对时忘了加 Read Group,可以用 Picard 补上
picard AddOrReplaceReadGroups \
I=input.bam \ # 输入 BAM
O=with_rg.bam \ # 输出 BAM
RGID=sample1 \ # Read Group ID
RGLB=lib1 \ # 文库名
RGPL=ILLUMINA \ # 测序平台
RGPU=unit1 \ # 平台单元
RGSM=sample1 # 样本名
5. BAM 排序
# 按坐标排序(虽然 samtools sort 也行,但 Picard 更严格)
picard SortSam \
I=unsorted.bam \ # 输入未排序 BAM
O=sorted.bam \ # 输出排序 BAM
SORT_ORDER=coordinate # 排序方式:coordinate/queryname
高级用法
1. 完整的 WGS 预处理流程
#!/bin/bash
# wgs_preprocess.sh - WGS 数据预处理(比对后处理)
SAMPLE="sample1"
REF="ref.fa"
# 第一步:排序(如果 BAM 未排序)
picard SortSam \
I=${SAMPLE}.bam \
O=${SAMPLE}.sorted.bam \
SORT_ORDER=coordinate # 按坐标排序
# 第二步:标记重复
picard MarkDuplicates \
I=${SAMPLE}.sorted.bam \
O=${SAMPLE}.dedup.bam \
M=${SAMPLE}.dup_metrics.txt # 重复率统计
# 第三步:建索引
samtools index ${SAMPLE}.dedup.bam # BAM 索引
# 第四步:收集多种质量指标
picard CollectMultipleMetrics \
I=${SAMPLE}.dedup.bam \
O=${SAMPLE}.metrics \ # 输出前缀
R=$REF \ # 参考基因组
PROGRAM=CollectAlignmentSummaryMetrics \ # 比对统计
PROGRAM=CollectInsertSizeMetrics \ # 插入片段
PROGRAM=CollectGcBiasMetrics \ # GC 偏差
PROGRAM=QualityScoreDistribution # 质量分布
echo "预处理完成: ${SAMPLE}"
2. 合并多个 BAM 文件
# 合并来自同一样本的多个 BAM 文件(如多条 lane)
picard MergeSamFiles \
I=lane1.bam \ # 第一个 BAM
I=lane2.bam \ # 第二个 BAM
I=lane3.bam \ # 第三个 BAM
O=merged.bam \ # 输出合并 BAM
SORT_ORDER=coordinate \ # 排序
USE_THREADING=true # 多线程
3. VCF 文件操作
# 合并多个 VCF 文件
picard MergeVcfs \
I=sample1.vcf.gz \ # 输入 VCF 1
I=sample2.vcf.gz \ # 输入 VCF 2
O=merged.vcf.gz # 输出合并 VCF
# 排序 VCF
picard SortVcf \
I=unsorted.vcf \ # 输入
O=sorted.vcf \ # 输出
SD=ref.dict # 序列字典
4. 创建序列字典(GATK 必需)
# GATK 需要 .dict 文件
picard CreateSequenceDictionary \
R=ref.fa \ # 参考基因组
O=ref.dict # 输出字典文件
# 也需要 .fai 索引
samtools faidx ref.fa # 创建 FASTA 索引
5. BAM 转 FASTQ
# 把 BAM 文件转回 FASTQ(比如需要重新比对)
picard SamToFastq \
I=input.bam \ # 输入 BAM
FASTQ=output_R1.fq.gz \ # 输出 R1
SECOND_END_FASTQ=output_R2.fq.gz \ # 输出 R2
UNPAIRED_FASTQ=unpaired.fq.gz # 未配对读长
常见报错与解决
| 报错信息 | 原因 | 解决方法 |
|---|
HTSJDK: ... corrupt CRAM | Picard 2.27.3-3.1.1 的 CRAM bug | 升级到 v3.2.0 |
java.lang.UnsupportedClassVersionError | Java 版本太低 | v3.0+ 需要 Java 17 |
ERROR: BAM file is not sorted | BAM 未排序 | 先 picard SortSam 或 samtools sort |
READ_GROUP not found | BAM 里没有 RG 信息 | 用 AddOrReplaceReadGroups 添加 |
OutOfMemoryError | Java 堆内存不够 | 用 java -Xmx8g -jar picard.jar |
TMP_DIR ... no space left | 临时目录空间不足 | 加 TMP_DIR=/big_disk/tmp 指定大盘 |
速查表
# ===== Picard 速查表 =====
# 安装
conda install -c bioconda picard # conda 安装
# 或通过 GATK4: conda install -c bioconda gatk4
# 标记重复(最常用)
picard MarkDuplicates I=in.bam O=dedup.bam M=metrics.txt
# 收集比对统计
picard CollectAlignmentSummaryMetrics R=ref.fa I=in.bam O=stats.txt
# 收集插入片段大小
picard CollectInsertSizeMetrics I=in.bam O=metrics.txt H=hist.pdf
# 添加 Read Group
picard AddOrReplaceReadGroups I=in.bam O=out.bam \
RGID=id RGLB=lib RGPL=ILLUMINA RGPU=unit RGSM=sample
# 排序 BAM
picard SortSam I=in.bam O=sorted.bam SORT_ORDER=coordinate
# 合并 BAM
picard MergeSamFiles I=a.bam I=b.bam O=merged.bam
# 创建序列字典
picard CreateSequenceDictionary R=ref.fa O=ref.dict
# BAM 转 FASTQ
picard SamToFastq I=in.bam FASTQ=R1.fq SECOND_END_FASTQ=R2.fq
# 多指标收集
picard CollectMultipleMetrics I=in.bam O=prefix R=ref.fa
# 通用参数
# VALIDATION_STRINGENCY=LENIENT 放宽验证
# TMP_DIR=/tmp 指定临时目录
# MAX_RECORDS_IN_RAM=500000 内存中最大记录数