2013-08-03 101 views
1

我想從給定的樹文件中刪除一組節點。python ete2從樹中刪除節點

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

問題是當我打印列表「刪除」它的gi給我一個沒有列表,並且我意識到樹中的節點數仍然是輸入文件 中任何建議的名稱數量的>個數。 在此先感謝

+0

你可以發表你正在使用的'Tree'對象的一些代碼嗎? – Houdini

+0

正如fransua先生所說,這裏是樹類http://pythonhosted.org/ete2/reference/reference_tree.html – AWRAM

回答

2

我不確定代碼的其餘部分是否工作找不到輸入文件的示例。 但是我發現這一點,可以改變:

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

n是實際上等於無,作爲刪除功能不返回任何東西。

PD:由@houdini的方式,所用的樹類記載有:http://pythonhosted.org/ete2/reference/reference_tree.html

編輯:

好,根據你輸入的文件,我會改變你的codelike這樣的:

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

和M IDS Y的列表文件:

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 
+0

我添加了輸入文件 – AWRAM

+0

@ awram,好的我編輯根據。希望這可以幫助。 – fransua

+0

非常感謝。我看到樹的拓撲結構已完全更改我想刪除節點,如果它只是一個葉子 – AWRAM