Подсчитайте количество групп (с определенным TAG) в определенном формате (с Python)

Всем привет нужна помощь:

Я не знаю, знакомы ли вы с филогенетическим деревом, но вот пример:

   /-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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Может быть, вам нужен 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

Другие вопросы по теме