python ete2 удалить узел из дерева
Я пытаюсь удалить набор узлов из данного файла дерева.
Input : tree file+ txt file contains the name of nodes that should only exists in the tree.
это мой код: `
def find_id(file,id):
f= open(file)
s = open(file).read()
if re.search(id,s,re.MULTILINE):
found= True
else:
found= False
return found
def remove_nodes(treeFile,idFile):
t= Tree(treeFile,format=8)
removed=[]
for node in t:
#print node.name
if not find_id(idFile,'^'+node.name+'\s') and node.is_leaf():
n= node.delete()
removed.append(n)
print removed
t.write(format=1, outfile="newtree.nw")
remove_nodes('arthropods.nw','taxidMap.txt')`
arthropods.nw - это файл дерева newick, это извлечение:
((260574)58772(874683,874682,874681,874680,874685,874684,1096898,874676,874677,874678,874679)89902(((((61988,390855,109756,62003,374072,244964,146864,251422,388540,438507,681530)61987,(244997,1068629,485196,681527,126872,111303,58784,134582,89817,231264)58783)109754,((289475,390856,118505)118504)118506)61986(((((756952,756950,756951,171369,1053728,231396)171368,(980235)980234,(118484)118483,(126927)126926,(1147029,863609,89974,1255757...
taxidMap.txt:
135631 NC_015190
29137 NC_003314
29139 NC_003322
...
проблема в том, что, когда я печатаю список "удаленных", он дает мне список ни одного, и я понимаю, что число узлов в дереве по-прежнему> числа имен во входном файле. заранее спасибо
1 ответ
Я не уверен, что остальная часть кода работает без примеров входных файлов. Но я обнаружил, что это может быть изменено:
- removed.append(n)
+ removed.append(node)
n фактически равно None, так как функция удаления ничего не возвращает.
pd: кстати для @houdini, используемый класс Tree там описан: http://pythonhosted.org/ete2/reference/reference_tree.html
РЕДАКТИРОВАТЬ:
Хорошо, согласно вашим входным файлам, я бы изменил ваш код следующим образом:
from ete2 import Tree
import re
def find_id(file,id):
f= open(file)
s = open(file).read()
if re.search(id,s,re.MULTILINE):
found= True
else:
found= False
return found
def remove_nodes(treeFile,idFile):
t= Tree(treeFile,format=8)
print t.get_ascii()
removed=[]
for node in t.iter_descendants():
# print node.name
if not find_id(idFile,'^'+node.name+'\s'):
node.delete(prevent_nondicotomic=False)
removed.append(node)
print [n.name for n in removed]
print t.get_ascii()
t.write(format=1, outfile="newtree.nw")
remove_nodes('arthropods.nw','taxidMap.txt')
мой файл дерева:
(58772,89902,((61988,390855)29139,((62003,374072)244964,146864,251422)388540,29137)61987);
и мой список файлов идентификаторов:
29137 NC_003314
29139 NC_003322
62003 NC_004444
И вот вывод:
/-58772
|
|--89902
|
| /-61988
-NoName /29139
| | \-390855
| |
| | /-62003
| | /244964
\61987 | \-374072
|-388540
| |--146864
| |
| \-251422
|
\-29137
['58772', '89902', '61987', '388540', '61988', '390855', '244964', '146864', '251422', '374072']
/-29139
|
-NoName-29137
|
\-62003
EDIT2:
Чтобы удалить только листья, просто удалите часть iter_descendants, как вы это делали:
def remove_nodes(treeFile,idFile):
t= Tree(treeFile,format=8)
print t
removed=[]
for node in t:
# print node.name
if not find_id(idFile,'^'+node.name+'\s'):
node.delete(prevent_nondicotomic=False)
removed.append(node)
print [n.name for n in removed]
print t
t.write(format=1, outfile="newtree.nw")
Однако в примере, который я использую, результат довольно уродливый:S ... возможно, с большим количеством узлов, чтобы сохранить его, было бы лучше.
/-58772
|
|--89902
|
| /-61988
--| /-|
| | \-390855
| |
| | /-62003
| | /-|
\-| | \-374072
|--|
| |--146864
| |
| \-251422
|
\-29137
['58772', '89902', '61988', '390855', '374072', '146864', '251422']
/-29139
|
-- /-|-- /- /-62003
|
\-29137