跳转至

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 CRAMPicard 2.27.3-3.1.1 的 CRAM bug升级到 v3.2.0
java.lang.UnsupportedClassVersionErrorJava 版本太低v3.0+ 需要 Java 17
ERROR: BAM file is not sortedBAM 未排序picard SortSamsamtools sort
READ_GROUP not foundBAM 里没有 RG 信息AddOrReplaceReadGroups 添加
OutOfMemoryErrorJava 堆内存不够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      内存中最大记录数