4. 参考基因组准备
做多组学转换,最绕不开的一步就是准备参考基因组。很多人觉得这活儿简单——去 UCSC 或者 Ensembl 拖个文件下来不就行了?嗯,真这么做,八成后面跑 STAR 或 bowtie2 时会踩坑。我个人习惯是把参考基因组和索引当成项目的基础设施来对待,一次搭好,反复用。
4.1 参考基因组下载——选对来源是第一步
我见过有人从网盘里随便下个 FASTA,结果染色体命名跟 GTF 对不上,跑完比对才发现问题,白白浪费三天。所以,务必从权威渠道获取:
- Ensembl:物种全、版本清晰,每季度更新一次。我用的是
Homo_sapiens.GRCh38.dna.primary_assembly.fa。 - NCBI RefSeq:命名更保守,适合要求严格的场景。
- UCSC:常用
hg38,但下载时注意它是 2bit 格式,要转成 FASTA。
这里有个避坑指南:我记得有一回项目里需要把 FASTQ 从 hg19 升级到 GRCh38,Ensembl 的染色体名字前面带 chr,而 NCBI 不带。如果混用,下游比对工具会直接报错。所以我后来写了个小脚本做统一检查。
ref/ 文件夹,里面按 species/build/source/ 分层放,比如 ref/human/GRCh38/ensembl/。这样多物种切换时心里有底。
4.2 构建比对索引——STAR / BWA / bowtie2 各有脾气
索引文件说白了就是把参考基因组建成一种快速检索的结构。不同比对工具要的索引不一样,不能混用。下面我按工具一个一个讲。
4.2.1 STAR 索引——RNA-seq 场景首选
STAR 对内存要求高,但速度快。我一般用 Ensembl 的 FASTA + GTF 一起建索引,一步到位。
# 下载 FASTA 和 GTF(以人类 GRCh38 为例)
wget ftp://ftp.ensembl.org/pub/release-112/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz
wget ftp://ftp.ensembl.org/pub/release-112/gtf/homo_sapiens/Homo_sapiens.GRCh38.112.gtf.gz
gunzip *.gz
# 建 STAR 索引
STAR --runThreadN 8 \
--runMode genomeGenerate \
--genomeDir ./star_index \
--genomeFastaFiles Homo_sapiens.GRCh38.dna.primary_assembly.fa \
--sjdbGTFfile Homo_sapiens.GRCh38.112.gtf \
--sjdbOverhang 149
参数说明:--sjdbOverhang 一般设为读长减 1。我的读长是 150 bp,就用 149。如果你读长不固定,保守点设 149 也没大问题。
df -h 确认空间。
4.2.2 BWA 索引——DNA比对 / 变异检测
BWA 适合 DNA 序列比对,尤其是全基因组或外显子组。它有三种算法:mem(主流)、aln(较老)、sw(少用)。我只用 BWA-MEM。
# 下载参考基因组(同 STAR 用的 FASTA 即可)
# 建 BWA 索引
bwa index -p hg38_bwa Homo_sapiens.GRCh38.dna.primary_assembly.fa
执行完后会生成 .amb、.ann、.bwt、.pac、.sa 五个文件。我一般用 -p 指定前缀名,方便在命令里直接引用。
4.2.3 Bowtie2 索引——小基因组或非编码RNA
Bowtie2 比 BWA 更擅长比对短序列,比如 miRNA 或细菌基因组。它的索引命令类似:
bowtie2-build --threads 8 \
Homo_sapiens.GRCh38.dna.primary_assembly.fa \
hg38_bowtie2
这里注意:Bowtie2 生成的 .bt2 索引文件与 BWA 不通用。我踩过一次坑——用 BWA 的索引传给 Bowtie2,直接报错退出。
4.3 GTF 注释文件——不只是基因位置清单
GTF 文件记录了基因、转录本、外显子等结构信息。你想想看,没有它,STAR 怎么知道哪个区域是内含子、哪个是外显子?测序数据转换到 H5AD 时,基因表达定量全依赖 GTF 里的 gene_id 和 gene_name 映射。
4.3.1 下载 GTF 的最佳实践
- Ensembl:与 FASTA 版本号必须一致。比如 GRCh38 release 112,就用对应的 GTF。
- GENCODE:质量更高,注释更完整,推荐用于人类和小鼠。格式也是 GTF。
- RefSeq:从 NCBI 下载,对于临床项目比较好。
我个人倾向用 GENCODE。它的 gene_type 字段标注得很细(protein_coding、lncRNA、pseudogene 等),后期过滤时很方便。
4.3.2 版本同步——最容易被忽视
为什么说版本同步很重要?有一回我帮同事排查问题:他下载的是 GRCh38.p13 的 FASTA,却用了 GENCODE v40 的 GTF。结果比对时 STAR 报了很多 warning,说 splice junction 与注释不匹配。查半天才发现 FASTA 和 GTF 的参考基因组版本差了好几个补丁。
ref/ 目录里放一个 README.txt,记录每个文件的来源、下载日期和 md5sum。比如:
# ref/human/GRCh38/ensembl/README.txt
# Homo_sapiens.GRCh38.dna.primary_assembly.fa
# 来源: Ensembl release 112
# 下载日期: 2025-01-15
# md5sum: a1b2c3d4e5f6...
#
# Homo_sapiens.GRCh38.112.gtf
# 来源: Ensembl release 112
# 下载日期: 2025-01-15
# md5sum: 9f8e7d6c5b4a...
4.4 知识结构图:参考基因组准备流程
4.5 避坑清单——我踩过的五个坑
| 坑点 | 后果 | 怎么避免 |
|---|---|---|
| FASTA 与 GTF 版本不一致 | 比对时报错或剪接位点不匹配 | 用同一 release 的文件 |
| 染色体命名方式不统一(chr1 vs 1) | 下游工具无法识别 | 统一成 Ensembl 或 UCSC 风格 |
| STAR 索引时 --sjdbOverhang 设置错误 | 外显子边界定量偏差 | 设为读长减1,比如150 bp就设149 |
| 索引建在临时目录(如 /tmp) | 磁盘写满,建索引失败 | 提前 df -h,放到有足够空间的分区 |
| 不记录 md5,文件损坏不自知 | 跑两天比对,结果全错 | 下载后立即校验 md5sum |