Подсчитать количество групп (с определенным тегом) в определенном формате (с Python) - PullRequest
2 голосов
/ 21 апреля 2019

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

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

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

1 Ответ

1 голос
/ 21 апреля 2019

Может быть, get_monophyletic из ete3 - это то, что вам нужно?http://etetoolkit.org/docs/latest/reference/reference_tree.html?highlight=get_monophyletic#ete3.TreeNode.get_monophyletic

из ete3 import Дерево импорта re

# 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
...