参考基因组下载与索引准备:Ensembl/UCSC/NCBI

2194 字
11 分钟
参考基因组下载与索引准备:Ensembl/UCSC/NCBI

参考基因组有多个来源和版本:Ensembl、UCSC、NCBI(RefSeq)、GENCODE,每个又分 primary_assembly、toplevel、no_alt 等变体。选错版本可能导致比对率异常或注释错位。本文覆盖基因组版本选择、下载地址、索引准备(bwa/bowtie2/hisat2/samtools/GATK)和 GTF/GFF 注释文件获取的全流程。

实测环境:Debian 13,所有工具 Conda 安装。人类 GRCh38 为主要示例。

1. 三大来源的区别——先搞清楚你下载的是什么#

1.1 Ensembl#

Ensembl 是欧洲生物信息学研究所(EBI)维护的,特点是注释做得很好,GTF 文件结构清晰。大多数 RNA-seq 流程(STAR、Salmon、featureCounts)默认接受 Ensembl 格式。

下载地址:ftp://ftp.ensembl.org/pub/

Ensembl 的文件命名逻辑(以 GRCh38 release 113 为例):

ftp://ftp.ensembl.org/pub/release-113/fasta/homo_sapiens/dna/
├── Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz # 主组装(推荐)
├── Homo_sapiens.GRCh38.dna.toplevel.fa.gz # 含单倍体/补丁
├── Homo_sapiens.GRCh38.dna_sm.toplevel.fa.gz # soft-masked
├── Homo_sapiens.GRCh38.dna_rm.toplevel.fa.gz # repeat-masked
└── Homo_sapiens.GRCh38.dna.alt.fa.gz # 仅alternate loci
文件类型内容适用场景选还是不选
primary_assembly主要染色体+未放置的 scaffoldRNA-seq、ChIP-seq✅ 推荐
toplevelprimary + 单倍体 + 补丁需要完整基因组信息⚠️ 文件大,索引慢
*.dna_sm.*soft-masked(重复序列小写)重复序列敏感的比对⚠️ 可选
*.dna_rm.*repeat-masked(重复序列变N)RepeatMasker 后再比对❌ 一般不推荐

我的建议:RNA-seq 和 ChIP-seq 就用 primary_assembly 理由:够用了,文件小,索引快,染色体名简洁(1, 2, 3... 而不是 chr1, chr2...)。

1.2 UCSC#

UCSC Genome Browser 的参考基因组,染色体名带 chr 前缀(chr1, chr2...),在美国用得更多。如果你下游要用 UCSC 的工具(bedGraphToBigWig、bigWig 可视化),UCSC 的命名更好。

下载地址:http://hgdownload.soe.ucsc.edu/goldenPath/hg38/bigZips/

Terminal window
# UCSC hg38 下载(约 3GB)
wget -c http://hgdownload.soe.ucsc.edu/goldenPath/hg38/bigZips/hg38.fa.gz

Ensembl vs UCSC 染色体名对比:

EnsemblUCSC说明
1chr1常染色体
XchrX性染色体
MTchrM线粒体
GL000220.1chrUn_GL000220v1未放置 scaffold

这个 chr 前缀是生信中最经典的坑之一。你的 BAM 里染色体叫 chr1,但参考基因组里叫 1——所有下游工具全炸。

1.3 NCBI/RefSeq#

NCBI 的 RefSeq 参考基因组,染色体名用 NCBI Accession(NC_000001.11),用的人少但某些工具链(如 GATK 的 bundle)会提供 NCBI 命名的参考。

下载地址:ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/001/405/

Terminal window
# NCBI GRCh38(GCF_000001405.40)
# 不推荐手动拼接 URL,用 datasets 工具
conda install -c conda-forge ncbi-datasets-cli -y
datasets download genome accession GCF_000001405.40 --include genome

我的建议:除非你的合作者指定用 NCBI,否则 Ensembl primary_assembly 或 UCSC hg38 就够了。 大部分生信软件对这两家的命名支持最好。

2. 完整下载流程——以 Ensembl 为例#

#!/bin/bash
# download_ref.sh —— 完整下载 Ensembl GRCh38 + GTF 注释
RELEASE=113
SPECIES="homo_sapiens"
ASSEMBLY="GRCh38"
BASE="ftp://ftp.ensembl.org/pub/release-${RELEASE}"
OUTDIR="./ref/GRCh38_ensembl"
mkdir -p "$OUTDIR"
# 1. 基因组 FASTA
echo "Downloading genome FASTA..."
axel -n 10 -o "$OUTDIR" \
"${BASE}/fasta/${SPECIES}/dna/${SPECIES^}.${ASSEMBLY}.dna.primary_assembly.fa.gz"
# 2. GTF 注释文件
echo "Downloading GTF annotation..."
axel -n 10 -o "$OUTDIR" \
"${BASE}/gtf/${SPECIES}/${SPECIES^}.${ASSEMBLY}.${RELEASE}.gtf.gz"
# 3. 校验
echo "Downloading CHECKSUMS..."
wget -q -O "$OUTDIR/CHECKSUMS" "${BASE}/fasta/${SPECIES}/dna/CHECKSUMS"
echo "Done! Files in $OUTDIR"
ls -lh "$OUTDIR"

下载完成后,解压基因组 FASTA:

Terminal window
gunzip -k "./ref/GRCh38_ensembl/Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz"
# -k 保留原 gz 文件

3. 全索引构建——一个脚本搞定所有比对器#

这是生信流程中最费时间但必须做的一步。下面这个脚本一次性建好 bwa、bowtie2、hisat2、samtools 和 GATK 需要的所有索引。

#!/bin/bash
# build_all_indices.sh —— 一键建好所有比对器索引
set -euo pipefail
GENOME="./ref/GRCh38_ensembl/Homo_sapiens.GRCh38.dna.primary_assembly.fa"
THREADS=16
OUTDIR="./ref/GRCh38_ensembl/indices"
mkdir -p "$OUTDIR"
echo "============================================"
echo "1/5: samtools faidx"
echo "============================================"
samtools faidx "$GENOME"
# 生成 .fai 索引文件
echo "============================================"
echo "2/5: GATK CreateSequenceDictionary"
echo "============================================"
# GATK 需要 .dict 文件(本质是 SAM header 格式的序列字典)
gatk CreateSequenceDictionary \
-R "$GENOME" \
-O "${GENOME%.fa}.dict"
# 或用 picard:
# picard CreateSequenceDictionary R="$GENOME" O="${GENOME%.fa}.dict"
echo "============================================"
echo "3/5: bwa index (BWA-MEM)"
echo "============================================"
# BWA 索引——建在基因组同目录
bwa index -p "${OUTDIR}/bwa/GRCh38" "$GENOME"
# 生成 .amb .ann .bwt .pac .sa 五个文件
echo "============================================"
echo "4/5: bowtie2-build"
echo "============================================"
bowtie2-build --threads "$THREADS" \
"$GENOME" \
"${OUTDIR}/bowtie2/GRCh38"
echo "============================================"
echo "5/5: hisat2-build (含 splice site + exon 信息)"
echo "============================================"
# hisat2 最好加上已知的 splice site 和 exon 信息提高比对精度
GTF="./ref/GRCh38_ensembl/Homo_sapiens.GRCh38.113.gtf.gz"
# 先从 GTF 提取剪接位点和外显子
hisat2_extract_splice_sites.py "$GTF" > "${OUTDIR}/hisat2/splicesites.txt"
hisat2_extract_exons.py "$GTF" > "${OUTDIR}/hisat2/exons.txt"
# 建索引(含已知剪接信息)
hisat2-build -p "$THREADS" \
--ss "${OUTDIR}/hisat2/splicesites.txt" \
--exon "${OUTDIR}/hisat2/exons.txt" \
"$GENOME" \
"${OUTDIR}/hisat2/GRCh38"
echo "============================================"
echo "All indices built!"
echo "============================================"
# 索引文件大小统计
echo ""
echo "Index sizes:"
du -sh "${OUTDIR}/"*

建索引的时间估算:

使用人类 GRCh38 primary_assembly(约 3.1 GB),16 线程:

工具索引大小耗时内存峰值
samtools faidx~3 MB<10秒~100 MB
GATK dict~1 MB<30秒~2 GB
bwa index~5.5 GB~1 小时~50 GB
bowtie2-build~3.5 GB~40 分钟~30 GB
hisat2-build~4.5 GB~2 小时~50 GB

总耗时约 4 小时,磁盘消耗约 13-15 GB(索引本身)+ 原基因组 ~3 GB。

4. 索引验证——建完了不等于能用了#

#!/bin/bash
# verify_indices.sh —— 验证所有索引是否可用
GENOME="./ref/GRCh38_ensembl/Homo_sapiens.GRCh38.dna.primary_assembly.fa"
echo "=== samtools faidx ==="
samtools faidx "$GENOME" chr1:1-100
# 应输出 chr1 前 100bp 序列
echo "=== bwa ==="
echo -e "@test\nACGTACGTACGT\n+\nIIIIIIIIIIII" > /tmp/test.fq
bwa mem -t 2 ./ref/GRCh38_ensembl/indices/bwa/GRCh38 /tmp/test.fq 2>&1 | head -5
# 不报错即可(未必能比对到)
echo "=== bowtie2 ==="
bowtie2 -x ./ref/GRCh38_ensembl/indices/bowtie2/GRCh38 -U /tmp/test.fq 2>&1 | head -5
echo "=== GATK dict ==="
head -5 "${GENOME%.fa}.dict"
# 应输出 @HD @SQ 等 SAM header
echo "=== Validation complete ==="
rm -f /tmp/test.fq

5. 染色体名统一——生信流程中最长的坑#

你已经看到了:Ensembl 用 1,UCSC 用 chr1。如果你的比对工具用的是 Ensembl 参考基因组但下游要导入 UCSC Genome Browser,你会需要转换:

Terminal window
# 方案1:改参考基因组的染色体名(推荐——一劳永逸)
sed 's/^>/>chr/' Homo_sapiens.GRCh38.dna.primary_assembly.fa \
| sed 's/>chrMT/>chrM/' \
> Homo_sapiens.GRCh38.dna.primary_assembly.chr.fa
# 但要注意:GTF 注释里的染色体名也要同步改!
# 方案2:用 BEDOPS 转换 BAM 染色体名映射
# chrom_map.txt:
# 1 chr1
# 2 chr2
# ...
# X chrX
samtools view -H sample.bam \
| sed 's/SN:\([0-9XYMT]\+\)/SN:chr\1/' \
| samtools reheader - sample.bam > sample_chr.bam

6. 踩坑记录#

坑1:Ensembl 染色体名里有 haplotype 和 patch#

症状:bwa mem 报染色体名超长或不识别。

原因:Ensembl toplevel 文件里除了标准染色体,还有 CHR_HG107_PATCHHG00733_alt 这些单倍体和补丁序列。这些序列的染色体名包含特殊字符,很多工具不识别。

Terminal window
# 检查参考基因组里有哪些染色体名
grep "^>" Homo_sapiens.GRCh38.dna.toplevel.fa | head -20
# 如果太多奇怪的名字,切回 primary_assembly

教训:直接用 primary_assembly,别折腾 toplevel。

坑2:GTF 和 FASTA 的染色体名不对应#

症状:featureCountschromosome not found in reference

原因:FASTA 是 UCSC 下载的(chr1),GTF 是 Ensembl 下载的(1)。

Terminal window
# 快速对比双方染色体名
grep "^>" ref.fa | sed 's/>//' | sort > fa_chroms.txt
cut -f1 annotation.gtf | sort -u > gtf_chroms.txt
diff fa_chroms.txt gtf_chroms.txt

教训:FASTA 和 GTF 必须从同一来源下载同一个 release。

坑3:bwa index 内存不够#

症状:bwa index 跑到一半 kill -9(OOM)。

原因:bwa index 对大型基因组(>3GB)的内存需求约为基因组的 12-15 倍。人类 GRCh38 需要约 40-50 GB RAM。

Terminal window
# 查看可用内存
free -h
# 如果不够,用服务器大内存节点或加 swap
# 或在 bwa 2 上用 -b 参数减小索引(以略降精度为代价)
bwa-mem2 index -p GRCh38 "$GENOME"
# bwa-mem2 内存效率更好

坑4:hisat2-build 跑到某些染色体卡住#

症状:建索引时进度停在某个染色体很久不动。

原因:hisat2 对含有大量 N 的 scaffold 处理效率极低。primary_assembly 里某些未放置的 scaffold 可能几乎全是 N。

Terminal window
# 查看 FASTA 文件中 N 的比例
seqkit fx2tab -nl ref.fa | awk '{n=$2; gsub(/[^Nn]/,"",n); print $1, length(n)/length($2)*100}' \
| sort -k2 -rn | head
# 如果某条染色体 N 比例 > 95%,考虑删掉
seqkit grep -n -v -p "GL|KI|scaffold" ref.fa > ref_clean.fa
# (注意:这是激进做法,只在确定不需要这些 scaffold 时用)

坑5:GTF 里染色体也带了 chr 但 FASTA 没有——反过来也有#

症状:跟坑2反过来——感觉命名一致但实际还是不对。

原因:Ensembl 某些 release(特别是老版本)的 GTF 可能混合了带 chr 和不带 chr 的染色体名。检查方法:

Terminal window
zcat annotation.gtf.gz | cut -f1 | sort -u | head -30
# 看输出是一致的 "1 2 3..." 还是混合的

坑6:下载的基因组有 DOS 换行符#

症状:samtools faidx[faidx] Failed to index,提示行长度不一致。

原因:从某些 Windows 服务器下载或用某些工具处理后,FASTA 的行尾变成了 \r\n(DOS 格式)。

Terminal window
# 检查
file ref.fa
# ref.fa: ASCII text, with CRLF line terminators ← 有问题!
# 修复
sed -i 's/\r$//' ref.fa
# 或用 dos2unix
dos2unix ref.fa

坑7:索引版本不兼容#

症状:bowtie2Reads file does not look like a FASTQ file 但实际上文件没问题。

原因:bowtie2 的索引格式在不同大版本之间变了。v2.4.x 建的索引在 v2.5.x 上可能无法直接使用。

Terminal window
# 检查 bowtie2 版本
bowtie2 --version
# 如果索引是旧版本建的,rebuild
bowtie2-build --threads 16 ref.fa bowtie2/GRCh38

教训:每换一次工具链版本,索引顺手重建一遍。

7. 小结——选型速查#

你的场景推荐来源文件染色体名
RNA-seq(STAR/Salmon/kallisto)Ensemblprimary_assembly1,2,3...
ChIP-seq/ATAC-seqEnsembl 或 UCSCprimary_assembly / hg38看下游工具
WGS/WES(GATK 流程)GATK Bundle (NCBI)Homo_sapiens_assembly38.fastachr1,...
上传 UCSC BrowserUCSChg38.fachr1,...
跨物种比较Ensemblprimary_assembly看 majority

把参考基因组这件事一次性做对,之后几个月都不用再碰它。


本文于 2025-06-14 在 Debian 13 上实测完成。Ensembl release 113,bwa v0.7.18,bowtie2 v2.5.4,hisat2 v2.2.1,samtools v1.23.1,GATK v4.6.1.0。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

参考基因组下载与索引准备:Ensembl/UCSC/NCBI
https://fg.ink/posts/reference-genome-preparation/
作者
风观
发布于
2025-09-15
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
风观
风有来路,观有所思
分类
标签
站点统计
文章
50
分类
1
标签
29
总字数
61,837
运行时长
0
最后活动
0 天前

文章目录