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 也没大问题。

注意:STAR 索引生成后会产生几十个文件,大约占用 30 GB 磁盘空间。我曾在服务器 /tmp 下建索引,结果磁盘写满导致崩溃。建议提前 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 知识结构图:参考基因组准备流程

参考基因组准备流程 数据源选择 Ensembl GENCODE NCBI RefSeq 下载 FASTA + GTF(版本一致) STAR索引 RNA-seq BWA索引 DNA-seq Bowtie2索引 small RNA / 细菌 验证索引完整性 + 版本核对

4.5 避坑清单——我踩过的五个坑

坑点 后果 怎么避免
FASTA 与 GTF 版本不一致 比对时报错或剪接位点不匹配 用同一 release 的文件
染色体命名方式不统一(chr1 vs 1) 下游工具无法识别 统一成 Ensembl 或 UCSC 风格
STAR 索引时 --sjdbOverhang 设置错误 外显子边界定量偏差 设为读长减1,比如150 bp就设149
索引建在临时目录(如 /tmp) 磁盘写满,建索引失败 提前 df -h,放到有足够空间的分区
不记录 md5,文件损坏不自知 跑两天比对,结果全错 下载后立即校验 md5sum
最后一句实在话:参考基因组准备是整个转换流程的基石。我曾经因为贪图省事,直接用了同事半年未更新的索引,结果分析结果怎么都复现不了。后来老老实实重下一套,问题全解决了。所以,别懒,该下的文件一个不能少,该建的索引一步不跳。这份功夫花下去,后面跑流程时你会感谢自己。