计算特定格式(使用Python)中的组(具有特定TAG)的数量

时间:2019-04-21 07:35:58

标签: python python-3.x phylogeny

大家好,我需要一些帮助:

我不知道您是否熟悉系统发育树,但这是一个例子:

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

这意味着BC彼此之间的关系更紧密,而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

and这个想法是在先前过程中评估的每个monophyletic groups中,以计算在物种进化系统中进化枝的MRCA形成的进化枝中结点的数量。

所以我有2 groups

第一个:

#    /-TAG2, seq_TAG2_Canis_austracus
# --|
#    \-TAG2, seq_TAG2_Canis_taurus
#

Canis_austracusCanis_taurus在物种系统发育中共享MRCA,此祖先形成由2 speciesCanis_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 个答案:

答案 0 :(得分:1)

也许您需要ete3的get_monophyletic? 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