TBtools做序列提取,这几个坑你大概率也踩过
做基因家族分析或者比较基因组学的人,应该都绕不开一个工具——TBtools。这个由华南农业大学陈程杰老师开发的工具箱,几乎成了植物生信分析的标配。名字里带个Tools,实际上它早就超出了“小工具”的范畴,从序列提取、比对可视化到基因结构绘制,样样都能干。但要说起日常使用频率最高的功能,序列提取绝对排得上号。
虽然这个功能界面简单,操作也不复杂,但我在实际使用中,包括给实验室的同学改作业式的看操作过程时,还是发现了很多容易绕弯路的地方。比如有人提取出来的序列是空的,有人提取出来的序列根本不是自己想要的基因家族成员,还有人提取完才发现ID对不上。今天就专门把TBtools做序列提取这件事,从思路到实操,再到各种报错和异常,完整拆开讲一遍。
1. 序列提取的核心场景:为什么你绕不开这个功能
先说清楚序列提取在基因家族分析里的位置。很多人一上来就点开工具界面,却不太清楚自己到底在做什么,这会导致参数调错或结果没法用。我习惯先想清楚:我要提取的是什么序列,从哪里提,提到之后拿来干嘛。
1.1 基因家族分析的起点:拿到目标基因的ID列表
基因家族分析(也就是热搜词里那个genefamily analysis)几乎都有一个固定流程:先通过HMMER搜索或者BLAST比对,从全基因组蛋白序列里找到候选基因;然后对这些候选基因进行结构域验证;验证通过之后,你就得到了一份最终的基因ID列表。这个列表可能包含几十个甚至几百个基因ID。
接下来要做的,就是从基因组、CDS、蛋白、上游启动子等不同来源里,把这批基因对应的序列提取出来。这一步是所有后续分析的地基。基因结构图要CDS和基因组的坐标,系统进化树要蛋白序列,启动子分析要上游序列,共线性分析要全部信息。你会发现这些分析的第一步,全是序列提取。
1.2 序列提取的类型:不只是把序列捞出来那么简单
TBtools里和序列提取相关的功能有好几个入口,不同入口解决不同需求,很多人在这里就迷路了。简单整理一下:
- 从序列文件中按ID提取序列:适合从FASTA文件里捞指定的序列,比如从全基因组蛋白文件里按基因ID批量提取指定序列,或者从CDS文件里提取对应序列。
- 从基因组文件中按坐标提取序列:适合给定染色体、起始位置、终止位置,把这一段序列捞出来。比如做启动子分析时,从基因上游2000bp区域提取序列。
- 批量提取上游/下游序列:用TBtools的Fasta Tools里的相关功能,或者Sequence Toolkit里的工具,一键提取基因上游1kb、2kb等区域的序列。
- 从GFF/GTF注释文件中提取序列:结合注释文件的信息,把基因、CDS、外显子、内含子等各种区间的序列提取出来,这个是最灵活的。
1.3 为什么首选TBtools而不是写脚本
你可能要说,这些东西用Python的Biopython、Perl或者Linux命令也能做,为什么非要用TBtools?我的看法是这样的:对于单条序列或少量序列,命令行当然没问题;但面对几十上百条序列,尤其是还要根据GFF文件的各种坐标属性来提取时,临时写脚本的调试成本一点不低。特别是实验室里并非人人都熟悉编程,TBtools把这一步图形化了,而且相当靠谱,还能顺便可视化验证提取出来的序列是否正确。
另外,TBtools自带的ID比对功能很实用,它能直接告诉你输入文件里的ID和序列文件里的ID哪些对得上、哪些对不上。很多提取结果为空的案子,最后查下来都是ID格式不一致导致的,这个功能就能快速排查掉。
2. 核心工具解析:Fasta Tools与Sequence Toolkit到底怎么选
TBtools的菜单看起来很长,但序列提取相关的核心区域,基本集中在Fasta Tools和Sequence Toolkit两个大类下面。这两个工具组我用了很久,功能有重叠,但各自的侧重点不同,搞清楚了就不容易点错。
2.1 Fasta Tools:最常用,也最容易上手
Fasta Tools是我用得最多的一个菜单组。它下面有几个和序列提取直接相关的功能:
- Fasta Extract by ID:最经典的功能,输入一个FASTA文件和一份ID列表,就能提取出对应序列,还能反向提取(即提取不在列表里的序列)。
- Fasta Extract by List:功能和上面类似,但可以用更灵活的方式读取ID列表,操作上略有区别。
- Fasta Merge / Extract Conserved Region:这个偏序列处理,对于单个基因内部的结构域提取或者人工截取区间会用到。
Fasta Extract by ID这个功能,界面就两个框:上面选序列文件(FASTA格式),下面选ID文件(txt格式,每行一个ID)。点Start之后,会弹出一个结果面板,左上角选择是否输出全部还是输出匹配的序列。值得注意的是,默认情况下TBtools会把输入文件里所有序列都列出来,包括没匹配上的,你要在结果栏挑选匹配上的那部分再输出。
2.2 Sequence Toolkit:更灵活,也更容易误操作
Sequence Toolkit是TBtools比较早期的套件,里面有一些Fasta Tools没有的精细化功能。比如:
- Sequence Split by ID
- Sequence Extract by ID with GFF
- Fasta Subsequence
其中Fasta Subsequence就是典型的按坐标提取序列的工具。比如你有一个基因组序列,想提取1号染色体上第10000到20000这段序列,它可以直接做。对于单个区间提取很方便,但如果是批量操作,我更推荐用GXF Sequences Extract,也就是结合GFF注释文件的提取方式。
2.3 GXF Sequences Extract:按注释文件批量提取的王牌工具
这个工具藏在TBtools的Gene Structure和Sequence相关菜单里,具体名字是GXF Sequences Extract。它的最大优势是:能读懂GFF/GTF注释文件,根据基因结构自动判断什么是CDS、什么是UTR、什么是内含子,从而一次性提取所有基因的CDS、蛋白、上游序列等。
操作流程大致是:
- 选择GFF3/GTF注释文件
- 选择对应的基因组FASTA文件
- 勾选要提取的类型(CDS、cDNA、protein、upstream等)
- 设置上游长度(比如2000bp)
- 点击Start,等待结果
这个工具做完之后,输出的文件里不仅包含对应序列,还会自动生成一个序列信息表,详细记录每个序列的来源坐标。我在做基因家族分析时,大部分序列批量提取工作都靠它完成。比脚本稳定,比手动点选高效。
3. 实操演示:从基因ID列表到拿到干净的启动子序列
前面把概念讲清楚了,下面用我最近做的一个基因家族分析实例,把整个提取流程完整走一遍。这个例子里我选的是一种植物的NBS-LRR基因家族,最终要提取每个成员的CDS序列和起始密码子上游2000bp的启动子序列。
3.1 准备输入文件:格式问题直接决定成败
先看输入文件的准备。核心输入有三个:基因组FASTA、GFF注释文件、基因ID列表。
基因组FASTA和GFF文件一般都能从数据库直接下载,这里不展开。关键要聊的是基因ID列表的准备。很多人习惯从Excel里直接复制粘贴基因ID到一个txt文件里,但格式有问题。
正确格式是:每行仅一个基因ID,末尾不要有多余空格或制表符。你看看我的示例列表:
gene00001 gene00012 gene00234 gene02345如果是从Excel里复制的,强烈建议不要直接粘贴,而是用“选择性粘贴—文本”的方式,或者先粘到记事本里看一下,确认没有隐藏的制表符。我就遇到过ID列表中间夹着看不见的制表符和换行混乱,导致TBtools识别出错的情况。
3.2 用GXF Sequences Extract批量提取CDS和蛋白
打开TBtools,在菜单栏找到GXF Sequences Extract,或者在搜索框里输入GXF。界面出来后,对应选择文件:
- GXF File:GFF3文件
- Genome Sequence:基因组FASTA文件
- Extract Type:勾选CDS和Protein
- 其他选项保持默认
点Start后,会出现一个进度条。这里我要特别提醒一下:如果你的基因组文件比较大,比如植物基因组动辄几百MB甚至上GB,TBtools在解析时可能会卡那么一小会儿,别以为程序崩了,等进度条跑完就行。
抽出来的CDS序列文件里,每条序列的header会自动带着坐标信息,例如:
>gene00001|CDS|chr1:12345-13456(+)这个信息在后面做基因结构可视化、或者人工核查的时候非常有用。很多工具导出的序列header干净得过分,反而丢失了坐标信息,后面排查问题还得重新回去找,很麻烦。
3.3 上游启动子序列提取:注意方向问题
启动子序列的提取,和CDS提取有个本质区别:它必须考虑基因链的方向。如果基因在正链上,上游2000bp就是基因起始位置往左数2000bp;如果基因在负链上,上游序列从基因末端(也就是转录起点所在的另一侧)往右数2000bp。这是初学者最容易踩的坑。
在GXF Sequences Extract里,如果勾选了Upstream Sequence选项,并设置长度2000,工具会自动处理正负链的方向问题。它会根据GFF里CDS的链方向来判断,这个我实测下来是准的。所以如果你用TBtools提取启动子,建议不要手动去指定坐标区间,直接让工具用注释文件自动判断,比自己算方向靠谱得多。
3.4 用Fasta Extract by ID处理需要自定义的序列
有些情况下,我不需要GXF提取的所有序列,而是只需要其中一部分基因ID的CDS。这时我会先用GXF提取出全基因组所有基因的CDS,然后用Fasta Extract by ID,输入目标ID列表,从CDS总文件里捞出我要的那部分序列。
这个流程看起来多了一步,但好处非常明显:以后如果基因家族成员调整了,比如新增了几个候选基因,我不用重新运行GXF,只需要在Fasta Extract by ID里换一份ID列表就行,效率高很多。
在Fasta Extract by ID的结果面板中,输出的时候注意文件名后缀。TBtools输出文件的默认格式是带.fa后缀的文本,但有时候也能选择输出其他格式。建议用.fa后缀,兼容性最好,后续导入别的工具也不会出事。
4. 常见问题与排查技巧实录
序列提取虽然操作简单,但出问题的时候,经常让人摸不着头脑。我把自己和身边人踩过的坑汇总了一下,整理成下面几个高频问题。
4.1 提取结果为空:先从ID格式排查
这是出现频率最高的问题。提取出来空结果或者结果数量远小于预期,80%以上是ID格式没对上。怎么排查?
先看输入ID文件里有没有隐藏字符。Linux习惯下生成的文本文件,换行符是\n,而Windows记事本生成的可能是\r\n。如果ID文件里末尾带了个\r,在TBtools里就可能匹配不上。解决办法是:在TBtools里用Notepad++或者VS Code把文件重新存为UTF-8无BOM格式,换行符统一为LF。
再看ID是否包含版本号。很多从NCBI下载的序列ID是这样的:
XP_015612345.1但你的ID列表里写的是:
XP_015612345就差一个“.1”,结果就是匹配不上。我自己的习惯是,做分析之前先统一ID格式,通常用脚本去掉版本号,保证所有输入文件里的ID风格一致。
还有一种是ID字符大小写的问题。TBtools默认是区分大小写的,这个要特别注意。你自己做ID列表的时候,最好保证和序列文件里的ID完全一致,不要一会儿大写一会儿小写。
4.2 启动子序列方向反了:检查坐标和链信息
启动子提取出来之后,你会得到一条以ATG或者转录起始位点附近为末尾的序列。如果你提取的序列开头是一堆N,或者方向明显不对,大概率是GFF文件里的链信息和你用的文件版本不匹配。
举个例子,有些GFF文件的mRNA特征里标注了链方向,但它的坐标范围没有包含UTR区域,这时候你提取上游序列,实际上可能把基因的一部分编码区也包含进去了。遇到这种情况,我建议先手动可视化检查一下:把基因的坐标放在IGV或者TBtools的Gene Structure View里看一眼,确认基因模型没有问题再提取。
还有一个实操小技巧:提取完启动子后,可以用一个小脚本统计一下提取序列的长度分布。正常情况下,你设置上游2000bp,提取到的序列长度就应该是2000bp左右(有些边界区域可能不够长度)。如果你发现大量序列长度异常,那一定是哪个环节出了问题。
4.3 序列文件过大导致卡顿或内存溢出
有些朋友的基因组序列文件是压缩过的,比如.gz格式。TBtools不支持直接读取压缩文件,要么先解压,要么在Linux里先转换格式。还有的基因组文件里每个染色体的序列名特别长,比如:
>Chr01 genome assembly chromosome 1这种带空格的header在部分功能里可能会解析异常。建议先用TBtools的Sequence Toolkits里的Sequence Rename功能,把染色体的名字统一整理成干净、简短的名称,比如Chr01、Chr02。
至于内存溢出,我一般建议不要一次处理太大的文件。比如全基因组所有基因的CDS一次性提取,输出文件特别大,后面的工具读取也慢。你完全可以按染色体分开处理,或者分批提取,每次的任务量小一点,稳定性好很多。
4.4 提取结果里出现大量“N”:注意基因组组装质量和参数设置
有朋友提取出序列后,发现序列中间有大段N,看起来特别碍眼。这有两种可能:一是基因组组装质量不好,序列本身就有gap;二是提取的时候,坐标范围超出了contig的实际长度。
如果是后者,通常是GFF文件里的坐标和当前版本的基因组文件不匹配。比如你用的是v1.0的GFF,但基因组序列是v2.0的,两个文件压根就不是一个版本。这种情况千万别强行分析,先找到配套版本的注释文件再操作。
4.5 把提取好的序列导入其他工具后报错
提取出来的序列本身没问题,但导入到MEGA、IQ-TREE、MEME这些工具时报错,这种情况也常见。大部分原因是序列文件里混了非ACGTN字符,比如终止密码子转换成“”符号,或者蛋白序列里有“X”。TBtools提取蛋白序列时,如果基因内部有提前终止的情况,序列里可能带“”。这个在比对建树的时候会引发问题。
解决办法是,TBtools里有一个Sequence Cleaner工具,可以过滤/替换非法字符。我一般会把提取出来的蛋白序列先过一遍这个工具,把“*”去掉或替换成“X”,再做后续分析。
5. 进阶技巧:用TBtools的可视化功能验证提取结果
序列提取完了,很多人的分析就到此为止了。但我的习惯是再花几分钟做一次可视化验证。TBtools自带基因结构可视化功能,能直观看到你提取的序列和基因结构的对应关系,这一步能揪出不少隐蔽问题。
5.1 用Gene Structure View验证CDS提取是否完整
我在做家族分析的时候,提取完CDS,会顺便在TBtools里绘制基因结构图。把GFF和基因ID列表导入Gene Structure View,它会展示每个基因的外显子-内含子结构。这时候可以对照你提取的CDS长度,检查是否有基因的CDS明显偏短或缺失外显子。
有一回我提取一个家族的CDS,发现其中一个基因序列长度只有它注释CDS的一半左右。检查后发现,是GFF文件里该基因的注释本来就存在缺失。如果不做这一步检查,拿这个不完整的序列去建树,整个基因家族的进化分析结果都会被带偏。
5.2 用Sequence Logo或保守结构域分析验证序列正确性
对于蛋白序列,我一般会用MEME Suite(在线版)或者TBtools自带的Motif Analysis功能,确认提取出来的序列包含预期的保守结构域。这相当于一个质量检查:如果NBS-LRR家族的蛋白序列里连NB-ARC结构域都找不到,那肯定是在提取环节出了问题,要么是ID选错了,要么是序列文件对应错了。
这一步成本很低,但收获很大。特别是当你从不同数据库下载文件时,基因ID的表达方式可能千差万别,验证一下能提前挡住很多低级错误。
5.3 一个减缓后续分析压力的习惯:输出前先排序
TBtools提取出来的序列顺序,通常和输入ID列表的顺序一致。但如果你用GXF提取全基因组的序列,再从中筛选,输出顺序可能和你的预期不太一样。我的习惯是,在最后输出之前,先对ID列表做一次排序和去重,确保每条序列只出现一次。
虽然这个操作不影响后续分析的实质结果,但能让你的中间文件更规范,后面画图、建树时也更方便对照。做科研,尤其是做生信,文件管理规范一点,能省下大量重复排查的时间。
6. 写在最后的实操心得
从序列提取这个看似不起眼的小步骤,其实能看出一个人做生信分析的基本功。我见过不少人,把大量精力花在后面的建树、画图上,结果在序列提取环节就埋下了隐患,最后分析结论经不起推敲。
我个人在实际操作中,习惯把“提取序列”当成一个独立的小项目来对待,每次都会检查三样东西:输入文件格式是否正确、ID是否完全对应、输出序列是否做可视化验证。这三步看似多余,却帮我避免了很多返工。
另外还有一个容易被忽略的点:TBtools的版本会持续更新,不同版本的菜单名称和界面布局可能有细微差别。如果你在网上下载的是老版本,有些功能入口可能找不到,建议直接从官方GitHub仓库下载最新版本,省得在看教程时对着不一样的界面怀疑人生。
序列提取这件事,掌握了方法和逻辑,几分钟就能完成一批基因的提取。但如果没有搞清楚原理,只知道点按钮,那出问题时就会很被动。希望这篇内容能让你不仅会操作,也能明白每一处设置背后的原因。后面再用TBtools做基因家族分析,提取序列这一步基本不会再卡你了。