1

特定のツリー ファイルから一連のノードを削除しようとしています。

Input : tree file+ txt file contains the name of nodes that should only exists in the tree.

これは私のコードです: `

def find_id(file,id):

    f= open(file) 
    s = open(file).read()
    if re.search(id,s,re.MULTILINE):
        found= True
    else: 
        found= False
    return found

def remove_nodes(treeFile,idFile):  
        t= Tree(treeFile,format=8)
        removed=[]
        for node in t: 
              #print node.name
              if not find_id(idFile,'^'+node.name+'\s') and node.is_leaf():
                   n= node.delete()
                   removed.append(n)
        print removed
        t.write(format=1, outfile="newtree.nw")

    remove_nodes('arthropods.nw','taxidMap.txt')`

arthropods.nw は newick ツリー ファイルで、これは抽出されたものです。

((260574)58772(874683,874682,874681,874680,874685,874684,1096898,874676,874677,874678,874679)89902(((((61988,390855,109756,62003,374072,244964,146864,251422,388540,438507,681530)61987,(244997,1068629,485196,681527,126872,111303,58784,134582,89817,231264)58783)109754,((289475,390856,118505)118504)118506)61986(((((756952,756950,756951,171369,1053728,231396)171368,(980235)980234,(118484)118483,(126927)126926,(1147029,863609,89974,1255757...

taxidMap.txt :

135631 NC_015190
29137 NC_003314
29139 NC_003322
...

問題は、「削除された」リストを印刷すると、リストが表示されず、ツリー内のノードの数がまだ入力ファイル内の名前の数よりも多いことに気付きますか?前もって感謝します

4

1 に答える 1

2

入力ファイルの例がないため、残りのコードが機能しているかどうかはわかりません。しかし、私はこれを見つけました、それは変更されるかもしれません:

- removed.append(n)  
+ removed.append(node)

delete 関数は何も返さないため、n は実際には None と等しくなります。

pd: ちなみに @houdini については、使用されている Tree クラスが文書化されています: http://pythonhosted.org/ete2/reference/reference_tree.html

編集:

OK、入力ファイルに従って、コードを次のように変更します。

from ete2 import Tree
import re

def find_id(file,id):

    f= open(file) 
    s = open(file).read()
    if re.search(id,s,re.MULTILINE):
        found= True
    else: 
        found= False
    return found

def remove_nodes(treeFile,idFile):  

    t= Tree(treeFile,format=8)
    print t.get_ascii()
    removed=[]
    for node in t.iter_descendants():
        # print node.name
        if not find_id(idFile,'^'+node.name+'\s'):
            node.delete(prevent_nondicotomic=False)
            removed.append(node)

    print [n.name for n in removed]
    print t.get_ascii()
    t.write(format=1, outfile="newtree.nw")

remove_nodes('arthropods.nw','taxidMap.txt')

私のツリーファイルは次のとおりです。

(58772,89902,((61988,390855)29139,((62003,374072)244964,146864,251422)388540,29137)61987);

そして私のidsファイルのリスト:

29137 NC_003314
29139 NC_003322
62003 NC_004444

そしてここで出力:

      /-58772
     |
     |--89902
     |
     |          /-61988
-NoName    /29139
     |    |     \-390855
     |    |
     |    |            /-62003
     |    |      /244964
      \61987    |      \-374072
          |-388540
          |     |--146864
          |     |
          |      \-251422
          |
           \-29137
['58772', '89902', '61987', '388540', '61988', '390855', '244964', '146864', '251422', '374072']

      /-29139
     |
-NoName-29137
     |
      \-62003

EDIT2:

葉だけを削除するには、ちょうどあなたがしていたように、 iter_descendants の部分を削除してください:

def remove_nodes(treeFile,idFile):

    t= Tree(treeFile,format=8)
    print t
    removed=[]
    for node in t:
        # print node.name
        if not find_id(idFile,'^'+node.name+'\s'):
            node.delete(prevent_nondicotomic=False)
            removed.append(node)

    print [n.name for n in removed]
    print t
    t.write(format=1, outfile="newtree.nw")

ただし、私が使用している例では、結果は非常に醜いです:S ...おそらくそれを保持するためのノードが多い方が良いでしょう。

   /-58772
  |
  |--89902
  |
  |      /-61988
--|   /-|
  |  |   \-390855
  |  |
  |  |      /-62003
  |  |   /-|
   \-|  |   \-374072
     |--|
     |  |--146864
     |  |
     |   \-251422
     |
      \-29137
['58772', '89902', '61988', '390855', '374072', '146864', '251422']

      /-29139
     |
-- /-|-- /- /-62003
     |
      \-29137
于 2013-08-03T11:03:47.460 に答える