4. 原始数据获取与预处理:下载FASTQ、检查文件完整性及MD5校验

好,咱们进入第四章。前面铺垫了那么多背景知识,现在开始真正碰数据了。

我记得第一次从公共数据库下载 FASTQ 的时候,光校验 MD5 就折腾了半小时——后来发现是 wget 少了个参数。你想想看,几百 GB 的测序数据,传了一晚上结果最后一个字节不对,整个重来……这种痛,一次就够了。

所以这一章我不光讲步骤,更要把踩过的坑摊开来。咱们把「下载 + 校验」这个看似简单的环节做扎实,后面的分析才站得住。

4.1 从公共数据库下载 FASTQ 文件

目前主流的转录组原始数据仓库就两个:NCBI 的 SRA(Sequence Read Archive)和 EBI 的 ENA。Visium 空间转录组数据通常以 FASTQ 格式存放,注意是双端测序(R1/R2),同时会附带一个样本信息表(metadata)。

我个人习惯用 ENA Browser 来获取下载链接。为什么呢?因为 ENA 直接提供了 FTP 路径,而且支持 wget 批量下载,速度比 SRA Toolkit 快不少。举个例子,找到项目 PRJEB12345 后,你会看到类似下面的链接:

# 单样本双端 FASTQ 示例
ftp.sra.ebi.ac.uk/vol1/fastq/ERR123/ERR123456/ERR123456_1.fastq.gz
ftp.sra.ebi.ac.uk/vol1/fastq/ERR123/ERR123456/ERR123456_2.fastq.gz

下载命令很直接,但有个容易被忽略的细节:压缩包名可能被截断,或者 FTP 服务器限速。我建议用 wget 的 -c 参数支持断点续传:

wget -c -P ./data/ERR123456/ \
  ftp.sra.ebi.ac.uk/vol1/fastq/ERR123/ERR123456/ERR123456_1.fastq.gz \
  ftp.sra.ebi.ac.uk/vol1/fastq/ERR123/ERR123456/ERR123456_2.fastq.gz

如果文件特别多,可以先生成一份 URL 列表,然后配合 aria2c 并行下载,能省不少时间。我常用的写法:

aria2c -j 8 -i url_list.txt -d ./data/

其中 -j 8 表示 8 个线程同时拉。不过要注意,有些公共 FTP 对并发有限制,遇上了就把线程数降到 2 或 3。

4.2 文件完整性检查与 MD5 校验

好了,文件下载完了。你以为就结束了吗?远着呢。传输过程中可能丢包、截断,甚至被篡改。我曾经急着跑分析,跳过校验,结果跑了一天发现某个样本的 R2 文件比预期少了 10MB……排查了半天,最后发现是网络问题导致的传输不完整。

所以这一步绝对不能省。大多数公共仓库在提供 FASTQ 的同时会附带一个 md5sum.txt 文件,里面每一行是文件名及其 MD5 值。校验命令在 Linux 下非常简单:

# 进入数据目录
cd ./data/ERR123456/

# 对比本地文件的 MD5 与官方值
md5sum -c md5sum.txt

如果输出格式是「文件名: OK」,说明文件完整;如果出现「文件名: FAILED」,就必须重新下载那个文件。

有时候官方只给了单个文件的 MD5,没有汇总文件。你可以自己生成一份:

# 对所有 .fastq.gz 计算 MD5
md5sum *.fastq.gz > local_md5.txt

# 然后手动跟官方公布的 MD5 值逐行对比
diff local_md5.txt official_md5.txt

其实 MD5 本身已经够快了,但我还是推荐用 sha256sum 做最终的完整性验证——安全性更高,虽然多花几秒,更稳妥。

对了,Windows 用户可以用 PowerShell 的 Get-FileHash:

Get-FileHash .\ERR123456_1.fastq.gz -Algorithm MD5

但我个人还是建议在 Linux 或 WSL 下做,省得碰上换行符问题。

4.3 下载与校验的常见工具对比

我把常用工具整理成了一张表,方便你根据场景选择:

工具适用场景优点缺点
wget单文件/少量文件自带断点续传、参数简单多文件需写脚本、并发差
curl自定义请求头、API调用支持更多协议、灵活断点续传需手动设置
aria2c大批量并行下载多线程、支持 Metalink配置稍复杂
aspera (ascp)大型文件高速传输利用 UDP 加速、超快需安装客户端、部分仓库收费
md5sum / sha256sum完整性校验系统自带、快速大文件 MD5 碰撞风险(极低)

千万别用浏览器直接右键另存为下载 FASTQ!一是浏览器会截断文件名,二是无法续传,一旦中断就得重来。我们团队之前有个新人这么干,下载 50GB 文件到 99% 断了……那天他加班到凌晨两点。

4.4 实战中的避坑指南

嗯,这里要重点说说我遇到的几个坑,希望能帮你绕过去。

  • 路径名里的特殊字符:ENA 给的 FTP 路径有时包含 ~ 或 ;,wget 可能会解析错误。记得用引号把 URL 括起来,或者用 --content-disposition 参数。
  • 磁盘空间不足:下载前先用 du -sh 看好剩余空间。FASTQ 压缩后通常 2-10GB,解压后膨胀 3-5 倍。我建议留出至少原始大小 5 倍的空余。
  • 防火墙限制 FTP 主动模式:有些机构网络只允许被动模式(PASV)。wget 默认自动协商,但偶尔会卡在主动模式。强制被动模式:wget --passive-ftp ...。
  • MD5 文件编码:从 Windows 上传到 Linux 的 md5sum.txt 可能带有 \r\n,导致 md5sum -c 报错。先用 dos2unix 转换一下。
  • 校验失败后的重试策略:不要只重下一个文件,很可能整个批次都有问题。我习惯在下载脚本里加入自动重试逻辑:失败则等待 30 秒后重试,最多 3 次。

下面这张图把整个流程串了起来,你可以跟着走一遍:

数据获取与预处理流程图 原始 FASTQ SRA/ENA/GEO 下载工具 wget/aria2/ascp MD5 校验 md5sum -c 校验结果? 重下载 FAILED 解压 gunzip / pigz OK 质检 (FastQC) 预处理 cutadapt/trimmomatic 结果汇总 multiQC 每一步后都建议保留原始压缩包,避免解压失败后重新下载

一句话总结本章:下载前规划好路径和空间,下载中用断点续传,下载后必须 MD5 校验。别省这一步,否则后面所有分析可能都是浪费。

好了,这一章到此结束。数据在手心里就踏实了——下一回咱们拿这些 FASTQ 开始做真正的预处理和质量控制。