Как обсуждалось в комментариях, ete3
дает нам функцию с именем Tree.get_closest_leaf
, но ее вывод не соответствует ожидаемому (и я не уверен, что это значение даже представляет здесь):
>>> t=ete3.Tree('((Species1_order1,(Species2_order2,Species3_order2)),Species4_order3,Species5_order5);')
>>> t.get_closest_leaf('Species2_order2')
(Tree node 'Species4_order3' (0x115b2f29), 0.0)
Вместо этого вы можете получить расстояние до узла следующим образом:
import ete3
import pandas as pd
def make_matrix(tree):
def get_root_path(node):
root_path = [node]
if node.up:
root_path.extend(get_root_path(node.up))
return root_path
leaves = tree.get_leaves()
leaf_ct = len(leaves)
paths = {node.name: set(get_root_path(node)) for node in leaves}
col_lbls = [leaf.name for leaf in leaves]
dist_matrix = pd.np.array([pd.np.zeros(leaf_ct)] * leaf_ct)
df = pd.DataFrame(dist_matrix, index=col_lbls, columns=col_lbls)
for node1_name, col in df.iteritems():
for node2_name in col.keys():
path = paths[node2_name].symmetric_difference(paths[node1_name])
dist = sum(node.dist for node in path)
df.at[node1_name, node2_name] = dist
df.at[node2_name, node1_name] = dist
return df
Примечание. Это неоптимальное решение по нескольким причинам, но этот вопрос не требует наиболее эффективного решения. см. эту ссылку для получения более подробной информации о методах филогенизации c.
В этом решении также используется pandas
, что является избыточным, поскольку оно действительно просто для удобства меток строк / столбцов. Нетрудно удалить зависимости pandas
и сделать это с собственными списками.
Вот вывод:
>>> tree=ete3.Tree('((Species1_order1, (Species2_order2, Species3_order2)), Species4_order3, Species5_order5);')
>>> make_matrix(tree)
Species1_order1 Species2_order2 Species3_order2 Species4_order3 Species5_order5
Species1_order1 0.0 3.0 3.0 3.0 3.0
Species2_order2 3.0 0.0 2.0 4.0 4.0
Species3_order2 3.0 2.0 0.0 4.0 4.0
Species4_order3 3.0 4.0 4.0 0.0 2.0
Species5_order5 3.0 4.0 4.0 2.0 0.0
Для опубликованных обновлений я не вижу ничего плохого. Похоже, чтобы дать правильные результаты. Вот дерево, отображаемое ete3 (я выделил 4 прыжка, которые учитываются на расстоянии от Interest_sequence
до Rhopalosiphum_maidis_Hemiptera
):
а вот столбец матрицы для Interest_sequence
, который ему соответствует:
>>> m['Interest_sequence']
Rhopalosiphum_maidis__Hemiptera 4.0
Drosophila_novamexicana__Hemiptera 5.0
Drosophila_arizonae__Hemiptera 6.0
Drosophila_navojoa__Hemiptera 6.0
Interest_sequence 0.0
Heliothis_virescens_droso_3a__nan 5.0
Mythimna_separata_droso__nan 6.0
Heliothis_virescens_droso_3i__nan 6.0
Scaptodrosophila_lebanonensis__Diptera 5.0
Mythimna_unipuncta_droso_A__nan 6.0
Xestia_c-nigrum_droso__nan 8.0
Helicoverpa_armigera_droso__nan 8.0
Mocis_latipes_droso__nan 7.0
Drosophila_busckii__Diptera 4.0
Drosophila_bipectinata__Diptera 5.0
Drosophila_mojavensis__Diptera 7.0
Drosophila_yakuba__Diptera 7.0
Drosophila_hydei__Diptera 7.0
Drosophila_serrata__Diptera 8.0
Drosophila_takahashii__Diptera 9.0
Drosophila_eugracilis__Diptera 11.0
Drosophila_ficusphila__Diptera 11.0
Drosophila_erecta__Diptera 12.0
Drosophila_melanogaster__Diptera 13.0
Sequence_A_nan__nan 14.0
Drosophila_sechellia__Diptera 15.0
Drosophila_simulans__Diptera 15.0
Drosophila_suzukii__Diptera 12.0
Drosophila_biarmipes__Diptera 12.0
Name: Interest_sequence, dtype: float64