Всем привет нужна помощь:
Я не знаю, знакомы ли вы с филогенетическим деревом, но вот пример:
/-YP_001604167.1
|
|--YP_001604351.1
--|
| /-seq_TAG2_Canis_taurus
| /-|
| | \-seq_TAG2_Canis_austracus
\-|
| /-YP_001798528.1
\-|
| /-YP_009173671.1
\-|
| /-seq_TAG1_Mus_musculus
\-|
| /-seq_TAG1_Mus_griseus
\-|
| /-seq_TAG2_Canis_canis
\-|
| /-seq_TAG2_Canis_familiaris
\-|
\-seq_TAG2_Canis_lupus
И это дерево кодируется особым форматом, который называется newick:
'(YP_001604167.1,YP_001604351.1,((seq_TAG2_Canis_austracus,seq_TAG2_Canis_taurus),(YP_001798528.1,(YP_009173671.1,(seq_TAG1_Mus_musculus,(seq_TAG1_Mus_griseus,(seq_TAG2_Canis_lupus,(seq_TAG2_Canis_familiaris,seq_TAG2_Canis_canis))))))));'
Дерево заканчивается точкой с запятой. Самый нижний узел в этом дереве является внутренним узлом, а не верхушкой. Внутренние узлы представлены парой совпадающих скобок. Между ними находятся представления узлов (seq_names
), которые находятся непосредственно descended
от этого node
, разделенные commas
.
сын, если у меня есть что-то вроде:
(A,(B,C));
Тогда это означает, что B
и C
более тесно связаны друг с другом, а A
наиболее отдалены друг от друга.
И идея моего вопроса заключалась в том, чтобы найти способ, используя, например, python для подсчета количества групп с одним и тем же «TAG_number
», которые ближе друг к другу, чем любые другие узлы TAG_number
или YP_number
.
Например, TAG2
в представлено в 2 groups
, где (seq_TAG2_Canis_taurus, seq_TAG2_Canis_austracus)
вместе, а вторая группа (seq_TAG2_Canis_canis, (seq_TAG2_Canis_familiaris , seq_TAG2_Canis_lupus))
вместе. Для TAG1
, как вы можете видеть, ни один из них не вложен вместе, потому что seq_TAG1_Mus_griseus
ближе к группе (seq_TAG2_Canis_canis, (seq_TAG2_Canis_familiaris , seq_TAG2_Canis_lupus))
, чем к другому TAG1 seq_TAG1_Mus_musculus
.
Итак, результат должен быть примерно таким:
groups for TAG_1 : 0
groups for TAG_2 : 2
Я знаю, что некоторые пакеты в Python или R доступны для того, чтобы определить, находится ли TAG_number в «monophyletic groups
», но нет ничего, что могло бы указать количество групп в дереве, если группы TAG_number
разделены в дереве.
Если у вас есть идеи, как это сделать? Спасибо большое.
Другая часть вопроса:
Теперь у меня есть Species phylogeny
, например:
| /-Canis_taurus
| /-|
| | \-Canis_astracus
| /-|
| | | /-Canis_africus
| | \-|
| | | /-Canis_familiaris
\-| \-|
| \-Canis _lupus
|
| /-Canis_canis
\-|
\-Lupus_lupus
и Идея состоит в том, чтобы в рамках каждого monophyletic groups
, оцененного в предыдущем процессе, подсчитать количество узлов в кладах, образованных MRCA кладов в филогенезе вида.
Итак, у меня есть 2 groups
:
Первый:
# /-TAG2, seq_TAG2_Canis_austracus
# --|
# \-TAG2, seq_TAG2_Canis_taurus
#
Здесь Canis_austracus
и Canis_taurus
разделяют MRCA
в филогении видов, и этот предок образует кладу, состоящую из 2 species
(Canis_austracus and Canis_taurus
)
Итак, виды Nb внутри филогенетического дерева видов = 2
# /-TAG2, seq_TAG2_Canis_lupus
# --|
# | /-TAG2, seq_TAG2_Canis_familiaris
# \-|
# \-TAG2, seq_TAG2_Canis_canis
Здесь 3 таксона имеют общий MRCA
, и этот предок образует кладу, состоящую из всех видов в филогении видов (7)
Итак, виды Nb внутри филогенетического дерева видов = 7
Может быть, вам нужен get_monophyletic из ete3? http://etetoolkit.org/docs/latest/reference/reference_tree.html?highlight=get_monophyletic#ete3.TreeNode.get_monophyletic
из дерева импорта ete3 импортировать повторно
# build tree
t = Tree("(YP_001604167.1,YP_001604351.1,"
"((seq_TAG2_Canis_austracus,seq_TAG2_Canis_taurus),"
"(YP_001798528.1,(YP_009173671.1,(seq_TAG1_Mus_musculus,"
"(seq_TAG1_Mus_griseus,(seq_TAG2_Canis_lupus,"
"(seq_TAG2_Canis_familiaris,seq_TAG2_Canis_canis))))))));")
# set tag as leave attribute
for leaf in t:
# get tag from name
tag = re.search('TAG[0-9]', leaf.name)
tag = tag.group(0) if tag else None
leaf.add_features(tag=tag)
# show the hole tree
print(t.get_ascii(attributes=["name", "tag"], show_internal=False))
# show all monophyletic groups for tag=TAG2
for node in t.get_monophyletic(values=["TAG2"], target_attr = "tag"):
print(node.get_ascii(attributes=["tag", "name"], show_internal=False))
# /-TAG2, seq_TAG2_Canis_austracus
# --|
# \-TAG2, seq_TAG2_Canis_taurus
#
# /-TAG2, seq_TAG2_Canis_lupus
# --|
# | /-TAG2, seq_TAG2_Canis_familiaris
# \-|
# \-TAG2, seq_TAG2_Canis_canis