Как и обещал, вот новая версия скрипта, для конвертации сохраненных деревьев из TNT, в формат newick.
Хотел исправить старый конвертер, взятый с сайта TNT, но в нем оказалось столько проблем, что проще переписать заново.
В FigTree, по прежнему наблюдаются проблемы при сохранении некоторых деревьев. Связаны с некорректными символами в именах таксонов. Эти символы не удалось найти (около трех тысяч таксонов в тестовом файле). Так что... найду - добавлю правило, а пока для ньюика можно пользовать дендроскоп.
#!/usr/bin/python
__author__ = 'Semargl'
import re, sys, os
def tntfile2newick(fn):
print fn
fh = open(fn, 'r')
treeslist = []
for line in fh:
if line.startswith("("):
pass
else:
continue
tntstr = line
tntstr2 = tntstr2newick(tntstr)
treeslist.append(tntstr2)
outfn = fn + ".newick"
outfh = open(outfn, 'w')
for newickstr in treeslist:
outfh.write(newickstr + "\n")
outfh.close()
fh.close()
print outfn
def tntstr2newick(tntstr):
tntstr = re.sub(r'\s', ',', tntstr)
tntstr = re.sub(r'\)\(', '),(', tntstr)
tntstr = re.sub(r',\)', ')', tntstr)
tntstr = re.sub(r'=', '', tntstr)
tntstr = re.sub(r'__', '_', tntstr)
tntstr = re.sub(r'/', '_', tntstr)
tntstr = re.sub(r'\*', '', tntstr)
tntstr = re.sub(r',,$', ';', tntstr)
r1=re.compile(r',(?P<r1>\d+)(?P<r2>,|\))')
tntstr = r1.sub(' \g<r1>\g<r2>', tntstr)
return tntstr
file_name = sys.argv[1]
tntfile2newick(file_name)