做进化相关分析的人,常常遇到各种问题。
但其实问题常常只会有一类,那就是数据格式!毕竟,输入文件都报错,你还能有别的问题?
进化分析相关的文件格式,或者某种格式,如Newick format的变化,可能就可以有无限种,以至于有人专门开发一个格式转换软件(已发表...名字我忘了)。
这是一个优秀的操作。其从一定程度上解决了进化数据存储文件格式太多所带来的混乱,并提出了一个新的格式(从此,又增加了一种格式 [微笑脸])。
推文下面,我以newick为示例,大概说一下这个问题的复杂情况。我并没有去测试那个格式转换软件,只知道,可能只有极少数(Mega不行,FigTree不行,Dedroscope不行,R语言的ape?肯定不行)以至于我也不知道的软件可能同时支持下面这些格式。
这个怎么说呢?是软件开发者和用户同时造成的问题。
其中矛盾产生的原因可能有:
1. 在写代码的人A眼中,软件用户B应该是很清楚,标准的文件输入是什么?
2. 在用软件的人B眼中,软件作者A应该心里有数,虽然我没有去了解过你的软件,不过我认为,只要我把我手上的文件放进去,或者我严谨一点,我拿其他软件的直接输入,导入到你的软件里面,你的软件如果运行不了,那么一定是你的软件问题,那就是你不行!
3. 在写代码的人A眼中,软件上游写代码的人C,难道不明白,软件输出应该做尽可能少的假设,严格控制输出为通用的最标准最规范的格式吗?";"软件下游写代码的人D,难道就不懂?软件输入应该做尽可能多的假设,搞明白任何输入的变体都存在可能吗?
*. 还有更复杂的情况,ACD已经互通有无了,B就是要修改文件,比如把制表符分隔的文本保存成Excel二进制.....【A,C,D:我能怎么办?我也很无奈....】
**进入主题,稍微整理一下, **
一开始你可能以为Newick文本是
((A,B),C);
后来你会发现,其实情况比较复杂,比如存在三叉,甚至多叉节点
((A,(B,C),D),E);
当然多叉节点没有问题,后来你发现枝长一般是存在的,
(((A:0.23,(B:0.23,C:0.23):0.23,D:0.23):0.23,E:0.23):0.23);
枝长当然也没问题,然后你会发现,不同软件的bootstrap value的标识方式是不同的,
比如Mega
(((A:0.23,(B:0.23,C:0.23)0.98:0.23,D:0.23)1.00:0.23,E:0.23)0.78:0.23);
而在raxML中,bootstrap是放在BrachLen之后的,如下
(((A:0.23,(B:0.23,C:0.23):0.23[98],D:0.23):0.23[100],E:0.23):0.23[98]);
这两个解析起来也并不麻烦,毕竟他们几乎不会同时出现在同一个字符串。 但是问题来了,有一些树美化软件,如FigTree,在进行着色等操作之后,导出Nexus格式,其TreeBlock区域也是事实上的Newick文本,有部分用户会用作其他分析,于是,糟糕!现在的情况是
(((A:0.23,(B:0.23,C:0.23)0.98[&label=0.034,!color=#000099]:0.23,D:0.23)1.00[&label=0.034,!color=#000099]:0.23,E:0.23)0.78[&label=0.034,!color=#000099]:0.23);
或者是
(((A:0.23,(B:0.23,C:0.23)[&label=0.034,!color=#000099]:0.23[98],D:0.23)[&label=0.034,!color=#000099]:0.23[100],E:0.23)[&label=0.034,!color=#000099]:0.23[78]);
当然还可能有最复杂的情况
(((A:0.23,(B:0.23,C:0.23)NodeLabel_1[&label=0.034,!color=#000099]:0.23[98],D:0.23)NodeLabel_2[&label=0.034,!color=#000099]:0.23[100],E:0.23)NodeLabel_3[&label=0.034,!color=#000099]:0.23[78]);
于是,之前写EasyCodeML的时候,整理了一个newick文本解析逻辑,可以解决上面出去FigTree的Nexus Treeblock中Newick之外的其他树文本读取模块;后来我在TBtools中(毕竟是不同工作),我重新实现了新的逻辑(有看推文的应该知道,我一开始是为了解析RNAfold之后的折叠结构文本,顺便实现的Newick文本解析逻辑),这才有后面的Amazing Heatmap 和 Amazing Optional Gene Viewer等可以和进化树同时可视化的图形。
一切并没有那么简单,FigTree导出的Nexus TreeBlock中newick文本解析一直放在我心里。基于课题组安排,在接下来的合作项目中,我们需要一个非常稳健的Newick文本解析功能。所以我又捡起了这放了一年有余的代码,做了必要的调整,于是搞定。
随着时间的流逝,年龄的增长,你就开始明白,想做的事情,常常需要抽空做;该做的事情应该安排最多的事情去保证其完成的优先度;如果你运气很好,那么你该做的事情,正好是你想做的事情,那么你会过得快乐。
从来都没有什么轻松快乐,只是有人替你负重前行。
比如你觉得某个软件用起来顺手,尤其是很少遇到使用问题且不是输入文件格式的问题时。
当然,队友之间,自然都是互帮互助,只要你不断保持成长,越来优秀,那么负重是相互的,而轻松快乐也是一起的。