随着小麦基因组注释版本的不断更新,中国春(Chinese Spring)参考序列的基因编号也从旧版逐步迁移到新版。对于经常处理转录组、比较基因组或重测序数据的生信研究者来说,ID不一致常常导致数据整合的“卡壳”时刻。最近,IWGSC(国际小麦基因组测序联盟)发布了RefSeq Annotations v2.1,对应的基因ID格式从原来的TraesCS*02G*(v1.1)变为了TraesCS*03G*(v2.1)。如何快速、准确地将手中的旧版ID映射到新版?本文将基于官方对应关系,为你提供一套清晰的处理流程和一个可直接复用的脚本,帮你轻松跨过版本鸿沟。
为什么需要更新基因ID?
基因组注释版本更新往往意味着基因模型更加准确、基因边界更清晰、甚至合并或拆分了一些基因座。v2.1版本在v1.1的基础上进行了大规模修正,因此ID命名规则也随之改变(数字部分从02变为03)。如果你正在使用Ensembl Plants、NCBI或IWGSC数据库下载的v1.1时代的数据,而新发表的论文或公共数据已采用v2.1,ID映射就是无法绕开的第一步。
数据来源与官方映射文件
所有官方对应关系都打包在IWGSC提供的压缩文件中,直接下载即可:
https://urgi.versailles.inrae.fr/download/iwgsc/IWGSC_RefSeq_Annotations/v2.1/iwgsc_refseq_all_correspondances.zip
解压后得到一个名为iwgsc_refseq_all_correspondances.csv的表格。该表格包含四列,依次是:v1.0(最早的注释版本)、v1.1(我们常用的旧版)、v2.1(新版)、css2014(另一套命名体系)。对我们来说,最关键的是第二列(v1.1基因ID)和第三列(v2.1基因ID)。
ID映射处理流程详解
直接拿旧ID去表格里搜索可不行,因为表格中的ID都是基因级别(不带转录本后缀),而且部分旧ID存在细微的格式错误。下面是经过验证的处理步骤:
第一步:去掉转录本版本号
你的ID通常是TraesCS2A02G206200.1这样的形式,末尾的“.1”表示转录本版本。官方映射表只包含基因ID(无后缀),因此必须先去掉“.1”。如果某基因有多个转录本,映射后也只会得到一个基因级的新ID。
第二步:修正常见格式错误
在实际处理中,我们发现两类典型错误:
- 前缀缺失或错位:如“raesCS2A02G206200.1”明显少写了“T”,需要补全为“TraesCS2A02G206200.1”。
- 数字位数不足:例如“TraesCS6A02G04170.1”实际上应该是“TraesCS6A02G041700.1”(数字部分固定为6位,缺位补零)。这些错误如果不修正,将无法匹配到任何结果。
第三步:在映射表中匹配
清洗后的旧ID与映射表第二列进行精确匹配,提取第三列作为新版ID。如果匹配失败,再尝试在ID末尾加上“LC”进行二次匹配(部分低置信度基因在表中带有“LC”后缀)。
第四步:去重
如果一个基因对应多条转录本,它们都会映射到同一个基因ID,因此输出时需按基因去重,保留唯一对应关系。
部分映射示例
下面列举了几个具有代表性的映射结果,可以直观感受版本变化:
-
TraesCS2A02G206200.1→TraesCS2A03G0433700 -
TraesCS2D02G209900.1→TraesCS2D03G0438600 -
TraesCS4D02G322700.1→TraesCS4D03G0752900 -
TraesCS6A02G04170.1(修正为TraesCS6A02G041700.1后) →TraesCS6A03G0093800 -
TraesCSU02G105300.1→TraesCSU03G0065000LC(此基因在v2.1中属于低置信度模型)
可以看到,大部分ID都能顺利找到对应关系,只有少数低置信度基因会带上“LC”标记。如果你在后续分析中使用这类基因,建议留意其注释质量。
一键复现:自动化映射脚本
为了让你能批量处理自己的ID列表,我们编写了一个Shell脚本map_cs_id_to_v21.sh。它内置了上述所有处理逻辑,并附带了示例ID供测试。
脚本用法
- 直接运行(使用内置示例):
./map_cs_id_to_v21.sh - 处理自定义ID文件(每行一个ID,支持空行和
#注释):./map_cs_id_to_v21.sh your_ids.txt
核心逻辑解读
脚本的核心部分并不复杂,但包含了几个关键细节:
# 1. 规范化ID:补全前缀、去掉后缀、补零
awk '
{
id=$0
sub(/^raesCS/, "TraesCS", id) # 修复前缀
sub(/\.1$/, "", id) # 去掉转录本后缀
if (id=="TraesCS6A02G04170") id="TraesCS6A02G041700" # 补零
print $0 "\t" id
}' "$INPUT" > normalized.tsv
# 2. 在映射表中匹配,并处理LC回退
while IFS=$'\t' read -r input_id old_id; do
new_id=$(awk -v k="$old_id" '$2==k {print $3; exit}' "$CSV")
if [ -z "$new_id" ]; then
new_id=$(awk -v k="$old_id" '$2==k"LC" {print $3; exit}' "$CSV")
fi
echo -e "$input_id\t$old_id\t${new_id:-NOT_FOUND}"
done < normalized.tsv
- 规范化步骤同时处理了前缀缺失和数字位数问题,确保匹配的准确性。
- 匹配时先精确查找,若失败则自动尝试带“LC”的版本,尽可能覆盖所有可能。
- 输出结果包含原始ID、规范化后的旧ID以及对应的新ID,方便你核对。
注意事项与扩展应用
- 映射是基因级别的:如果你需要保留转录本信息,映射后可能需要根据新ID重新从GTF/GFF文件中提取转录本列表。
- 低置信度基因(LC):部分ID映射结果带有“LC”,表明这些基因在v2.1中属于低置信度模型,使用时需谨慎,或考虑用同源基因替代。
- 脚本修改建议:如果你需要映射的ID量非常大(数万条),建议将映射表加载到数据库或用Python的pandas进行合并,脚本适合中小规模列表的快速验证。
希望这份指南和脚本能帮你顺利完成基因ID的版本升级。如果你在映射过程中遇到其他奇葩的ID格式,也欢迎分享到评论区,大家一起完善这个实用工具。