4. 基因组数据获取:三大数据库实战对比

说到基因组数据获取,我碰过不少新手——上来就开干,结果跑了几天的模型发现参考基因组版本不对,全白搭。所以这部分我重点讲怎么选数据库、怎么下载、怎么对版本号。你想想看,GPU再快,原料错了也没用。

4.1 数据库选型:NCBI、Ensembl、UCSC

这三个数据库是基因组领域的主流选择。我个人的使用习惯是这样:

数据库 数据管理方式 基因组版本 注释质量 我常用的场景
NCBI RefSeq + GenBank 双轨制 GRCh38.p14 等 经过人工审核,保守 临床级分析,一致性要求高的项目
Ensembl Ensembl 主版本 + 各物种分支 GRCh38 等 更新频繁,包含更多转录本 转录组分析、比较基因组学
UCSC hg19 / hg38 等 与 Ensembl 同源但标识不同 紧贴基因组浏览器,注释稍精简 可视化查看、bed 文件操作

我在项目中遇到过好几次版本混乱的问题——Ensembl 的 GRCh38 和 UCSC 的 hg38 虽然名义上对应,但染色体命名细节有差异。比如线粒体 DNA,Ensembl 叫 MT,UCSC 叫 chrM。不改过来,GPU 加载的时候直接崩。

我建议:如果项目涉及多数据库交叉引用,优先选 Ensembl 的 GTF 做注释源,然后统一转成 UCSC 风格的染色体名。这样两边都能对上。

4.2 下载参考基因组

下载参考基因组,说白了就是拿整个 FASTA 文件。但我提醒一句——直接拿 wget 拉全基因组的 ftp 目录,速度可能很慢。我一般用 rsync + 镜像站,能省不少时间。

4.2.1 从 NCBI 下载

# 下载人类参考基因组 GRCh38.p14(完整版)
wget -c https://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/000/001/405/GCA_000001405.29_GRCh38.p14/GCA_000001405.29_GRCh38.p14_genomic.fna.gz

一定要加 -c 参数。网络不稳的时候,断了能续传。我曾经下载到 98% 断掉,没加续传,重下了一整天。

4.2.2 从 Ensembl 下载

# rsync 方式下载(速度快)
rsync -avzP rsync://ftp.ensembl.org/ensembl/pub/release-112/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz .

我习惯只下 primary_assembly 版本,它排除了 haplotype 和 patches,文件小很多。项目初期可以先用这个,等调通流程再加全版本。

4.2.3 从 UCSC 下载

# 用 rsync 拉 hg38 参考基因组
rsync -avzP rsync://hgdownload.soe.ucsc.edu/goldenPath/hg38/bigZips/hg38.fa.gz .

注意:UCSC 的 hg38.fa.gz 默认包含 chrUn 和随机片段。如果你的 GPU 管线对基因组大小敏感,建议先过滤掉这些非标准 contig,否则显存占用会异常升高。

基因组数据获取流程 基因组数据获取 NCBI (RefSeq) Ensembl UCSC (hg38) 参考基因组 (FASTA) 参考基因组 (FASTA) 参考基因组 (FASTA) 注释文件 (GTF/GFF) 注释文件 (GTF/GFF) 注释文件 (GTF/GFF) 版本校验 & 染色体命名对齐 GPU 管线输入:统一格式

4.3 下载注释文件(GTF/GFF)

注释文件才是基因组特征构建的核心原料。我个人习惯优先选择 Ensembl 的 GTF,因为它的 exon、CDS、UTR 分区最细,适合 GPU 并行处理特征矩阵。

4.3.1 Ensembl 注释文件

wget -c https://ftp.ensembl.org/pub/release-112/gtf/homo_sapiens/Homo_sapiens.GRCh38.112.gtf.gz

这里有个坑——Ensembl 的 GTF 对 gene_biotype 做了比较细的分类,比如 protein_coding、lncRNA、miRNA 等。你在 GPU 端做特征工程时,如果需要区分基因类型,可以一次性扫进来再过滤。我曾经踩过坑:跑完特征提取才发现 lncRNA 占比 60%,把 GPU 显存撑爆了。所以提前做好过滤策略很重要。

4.3.2 NCBI 注释文件

# NCBI 的 GFF 格式
wget -c https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/001/405/GCF_000001405.40_GRCh38.p14/GCF_000001405.40_GRCh38.p14_genomic.gff.gz

NCBI 的 GFF 和 Ensembl 的 GTF 在属性字段编码上有差异。如果你直接在 GPU 上按列号去解析,小心列偏移。我建议统一用 gffread 转成标准 GTF。

# 用 gffread 把 GFF 转成 GTF
gffread GCF_000001405.40_GRCh38.p14_genomic.gff -T -o ncbi_annotation.gtf

4.3.3 UCSC 注释文件

# UCSC 的 refGene 注释(txt 格式)
wget -c https://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/refGene.txt.gz

UCSC 的注释格式比较特殊,是数据库 dump 后的 tab 分隔文件。如果你想把它转成标准的 GTF,可以用 genePredToGtf 这个工具。

我建议:在大型 GPU 集群上跑,下载的时候最好用 aria2c 代替 wget,它支持多线程分片下载,速度能快 5-10 倍。

4.4 版本验证与目录结构

文件下完了,别急着解压。第一步是验证 MD5 校验和。我遇到过两次 ftp 传输不完整的情况,校验把损失卡在零。

# 下载校验和文件
wget -c https://ftp.ensembl.org/pub/release-112/gtf/homo_sapiens/CHECKSUMS

# 验证 GTF
md5sum -c CHECKSUMS 2>&1 | grep "Homo_sapiens.GRCh38.112.gtf.gz"

验证通过后,我一般按下面这个目录结构组织数据:

data/
├── raw/
│   ├── genome/
│   │   └── Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz
│   └── annotation/
│       └── Homo_sapiens.GRCh38.112.gtf.gz
├── processed/
│   ├── genome.fa (解压后的参考基因组)
│   └── annotation.gtf (标准化后的注释)
└── logs/
    └── download.log

为什么要把 raw 和 processed 分开?因为 GPU 管线经常需要多次重新处理注释文件。如果直接修改 raw data,想回退就麻烦了。保持 raw 只读,processed 可复现——这是我踩了无数次坑才养成的习惯。

好了,数据拿到了。接下来就是怎么把这些 FASTA 和 GTF 喂给 GPU 做特征工程。下一部分我会重点讲 GPU 解析注释文件的优化策略,但今天先到这里。