输入序列准备:FASTA格式规范、序列标识符要求、多序列文件处理
做InterProScan跑批量的序列注释,第一步就是准备输入数据。这一步看着简单,但翻车的人真不少。我这些年帮别人排查问题,十次里有四五次都是序列格式搞砸了——要么是多了一个空格,要么是标识符里混了特殊字符。你得信我,花10分钟把序列准备好,比跑完任务再重来要划算得多。
FASTA格式的核心规范
FASTA格式其实没啥复杂的,就是两条规则:
- 描述行以
>开头,后面跟标识符和可选的描述文字 - 序列行只包含标准的氨基酸或核苷酸字母
但恰恰是这种简单,让人容易掉以轻心。我见过有人把序列行里混进数字,还有人把 > 前面加了空格,这些在InterProScan里都会直接报错。
# 正确示例
>sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens
MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGP
DEAPRMPEAAPPVAPAPAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAK
SVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPPGTRVRAMAIYKQSQHMTEVVRRCPHH
# 错误示例1:描述行前有空格
sp|P04637|P53_HUMAN Cellular tumor antigen p53
MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGP
# 错误示例2:序列行包含非法字符
MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGP123
我个人习惯,在提交前先用 grep -v "^>" 过滤掉描述行,然后检查剩下的行有没有非字母字符。小技巧,但很管用。
序列标识符的那些坑
很多人以为标识符随便写个名字就行。天真了。InterProScan对标识符有严格限制——说白了,它用标识符做中间文件名、数据库键值,你乱写它就乱崩。
我在项目中遇到过什么情况?有人用中文当标识符,有人用竖线 | 分隔符却忘了转义,还有人标识符里带了换行符。这些在本地跑可能没问题,但一旦上集群、走PBS调度、或者跨平台迁移时,全部炸给你看。
我建议遵循以下规范:
| 要求项 | 规范 | 为什么 |
|---|---|---|
| 字符集 | 仅使用 [a-zA-Z0-9_.-] |
避免特殊字符在shell、数据库、文件系统中被解析成其他含义 |
| 长度上限 | 不超过100字符 | 超长标识符导致文件系统截断或日志行溢出 |
| 首字符 | 必须是字母 | 部分下游工具以数字开头的标识符行为不可预测 |
| 唯一性 | 整个文件内不能重复 | InterProScan会基于标识符去重,重复时只保留第一条 |
@ 和 # 字符,在PBS脚本里被当成了变量引用符号,结果运行一半直接崩溃。跑了8个小时的作业废了。从那以后我写了个脚本,专门过滤非法字符。
怎么验证标识符?很简单,用 grep 跑一下就行:
# 检查非法字符
grep "^>" your_seqs.fasta | grep -E "[^a-zA-Z0-9_.-]" | head -5
# 检查重复标识符
grep "^>" your_seqs.fasta | sort | uniq -d
# 检查超长标识符
grep "^>" your_seqs.fasta | awk 'length($0) > 100'
这三条命令跑完,没问题了再往下走。你想想看,2000条序列一起跑,结果因为某个人的ID用了个管道符全崩了——这种情况我见过不止一次。
多序列文件的处理要点
真正的大活儿来了。单条序列好办,几十万条序列的FASTA文件,你怎么处理?InterProScan虽然是批处理工具,但它对文件结构还是有脾气。
核心要点就三个:
- 每个序列ID必须唯一。 —— 重名了?InterProScan不会帮你改,直接覆盖输出结果。你排查的时候还以为是某个序列没出结果,其实是结果被覆盖了。
- 不能有空序列。 —— 描述行后面直接接下一个
>,中间没有序列数据。这种叫空条目,InterProScan遇到会跳过,但不报错。你以为是它跑了,其实它什么都没跑。 - 文件不能太大。 —— 我建议单文件不超过5万条序列,不然内存撑不住,特别是做HMMER搜索时。
seqkit stat 看一眼统计信息。序列条数、最长最短、GC含量、是否有空行,一眼全清楚。别用 wc -l,那玩意儿数的是行数不是序列数。
# 查看FASTA文件统计信息
seqkit stat input.fasta
# 拆分成每个子文件5000条序列
seqkit split -s 5000 input.fasta -o split_dir/
# 检查空序列
seqkit grep -r -p "^$" input.fasta
我曾经遇到过一个用户,他提交了3000条序列,其中200条是空序列。他问我为什么有些序列没有结果,我一排查就发现了。说白了,他那个FASTA文件是从Excel粘贴过来的,Excel的行尾处理和换行符搞得一塌糊涂。
还有个问题要注意:换行符的一致性。Windows环境下生成的 .fasta 文件,换行符是 \r\n,Linux下是 \n。InterProScan在Linux上跑,遇到 \r 会把它当成序列的一部分,导致匹配不上任何数据库。
怎么修?一行命令的事:
# 转换换行符
sed -i 's/\r$//' input.fasta
嗯,这里要注意:加了 -i 是直接修改原文件。保险起见,先备份再操作。
知识结构总览
我把上面讲的内容画了一个流程框架图,你对照着梳理一遍就好。
1. 写个脚本一键校验FASTA格式 —— 别用手翻文件。
2. 标识符用
seqid_YYYYMMDD_N 这种套路,保证唯一性和可读性。3. 大文件拆成多个子文件,并行跑InterProScan,最后合并结果。又快又稳。
4. 永远先跑一个10条序列的测试集,确认没问题了再上全量数据。