参考基因组下载与索引准备: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 | 主要染色体+未放置的 scaffold | RNA-seq、ChIP-seq | ✅ 推荐 |
toplevel | primary + 单倍体 + 补丁 | 需要完整基因组信息 | ⚠️ 文件大,索引慢 |
*.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/
# UCSC hg38 下载(约 3GB)wget -c http://hgdownload.soe.ucsc.edu/goldenPath/hg38/bigZips/hg38.fa.gzEnsembl vs UCSC 染色体名对比:
| Ensembl | UCSC | 说明 |
|---|---|---|
1 | chr1 | 常染色体 |
X | chrX | 性染色体 |
MT | chrM | 线粒体 |
GL000220.1 | chrUn_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/
# NCBI GRCh38(GCF_000001405.40)# 不推荐手动拼接 URL,用 datasets 工具conda install -c conda-forge ncbi-datasets-cli -ydatasets 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=113SPECIES="homo_sapiens"ASSEMBLY="GRCh38"BASE="ftp://ftp.ensembl.org/pub/release-${RELEASE}"OUTDIR="./ref/GRCh38_ensembl"
mkdir -p "$OUTDIR"
# 1. 基因组 FASTAecho "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:
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=16OUTDIR="./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.fqbwa 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.fq5. 染色体名统一——生信流程中最长的坑
你已经看到了:Ensembl 用 1,UCSC 用 chr1。如果你的比对工具用的是 Ensembl 参考基因组但下游要导入 UCSC Genome Browser,你会需要转换:
# 方案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.bam6. 踩坑记录
坑1:Ensembl 染色体名里有 haplotype 和 patch
症状:bwa mem 报染色体名超长或不识别。
原因:Ensembl toplevel 文件里除了标准染色体,还有 CHR_HG107_PATCH、HG00733_alt 这些单倍体和补丁序列。这些序列的染色体名包含特殊字符,很多工具不识别。
# 检查参考基因组里有哪些染色体名grep "^>" Homo_sapiens.GRCh38.dna.toplevel.fa | head -20
# 如果太多奇怪的名字,切回 primary_assembly教训:直接用 primary_assembly,别折腾 toplevel。
坑2:GTF 和 FASTA 的染色体名不对应
症状:featureCounts 报 chromosome not found in reference。
原因:FASTA 是 UCSC 下载的(chr1),GTF 是 Ensembl 下载的(1)。
# 快速对比双方染色体名grep "^>" ref.fa | sed 's/>//' | sort > fa_chroms.txtcut -f1 annotation.gtf | sort -u > gtf_chroms.txtdiff 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。
# 查看可用内存free -h
# 如果不够,用服务器大内存节点或加 swap# 或在 bwa 2 上用 -b 参数减小索引(以略降精度为代价)bwa-mem2 index -p GRCh38 "$GENOME"# bwa-mem2 内存效率更好坑4:hisat2-build 跑到某些染色体卡住
症状:建索引时进度停在某个染色体很久不动。
原因:hisat2 对含有大量 N 的 scaffold 处理效率极低。primary_assembly 里某些未放置的 scaffold 可能几乎全是 N。
# 查看 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 的染色体名。检查方法:
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 格式)。
# 检查file ref.fa# ref.fa: ASCII text, with CRLF line terminators ← 有问题!
# 修复sed -i 's/\r$//' ref.fa# 或用 dos2unixdos2unix ref.fa坑7:索引版本不兼容
症状:bowtie2 报 Reads file does not look like a FASTQ file 但实际上文件没问题。
原因:bowtie2 的索引格式在不同大版本之间变了。v2.4.x 建的索引在 v2.5.x 上可能无法直接使用。
# 检查 bowtie2 版本bowtie2 --version
# 如果索引是旧版本建的,rebuildbowtie2-build --threads 16 ref.fa bowtie2/GRCh38教训:每换一次工具链版本,索引顺手重建一遍。
7. 小结——选型速查
| 你的场景 | 推荐来源 | 文件 | 染色体名 |
|---|---|---|---|
| RNA-seq(STAR/Salmon/kallisto) | Ensembl | primary_assembly | 1,2,3... |
| ChIP-seq/ATAC-seq | Ensembl 或 UCSC | primary_assembly / hg38 | 看下游工具 |
| WGS/WES(GATK 流程) | GATK Bundle (NCBI) | Homo_sapiens_assembly38.fasta | chr1,... |
| 上传 UCSC Browser | UCSC | hg38.fa | chr1,... |
| 跨物种比较 | Ensembl | primary_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。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!