他人に説明するときなどに、系統樹のノードに番号が付いていると便利な場合がたまにあります。AとBの共通祖先等の表現でも良いんですが長くなりやすいので。
今回はPythonとETE Toolkitを使って系統樹のノードに通し番号を付けたのでそのまとめです。使用したコードはページの一番下に載せました。
インストール
系統樹の可視化など幅広い操作に対応しているETE Toolkitですが、今回利用したのはNewick形式の系統樹の読み取りと書き出しだけですので、pipを使って基本の機能だけをインストールしました。全ての機能を利用したい場合はAnacondaを利用すると簡単にインストールできます。
sudo pip3 install ete3
コードの補足説明
ETE ToolkitのTreeクラスを利用して、Newick系統樹の編集を行います。変換のイメージは下の図の通りです。
# 変換前 /-A | /-| /-B | | /-| | | | \-C | \-| --| | /-D | \-| | \-E | | /-F \-| \-G
# 変換後 /-A | /001 /-B | | /004 | | | \-C | \003 --| | /-D | \005 | \-E | | /-F \002 \-G
Newick形式のファイルを読み込んでTreeオブジェクトを生成し、traverseメソッドで各ノードを順に辿って行きます。ノードを辿る順番はstrategyによって変わるため詳しくは公式のチュートリアルをご覧ください。
各ノードのname属性に通し番号を付けて行きます。系統樹の末端にまで番号を付けてしまうとOTU名が削除されてしまうためis_leafメソッドで判定しスキップします。
また、rootにまで番号を付けてしまうと色々とややこしかったので今回はスキップしました。各ノードがrootかどうかはis_rootメソッドで簡単に判定可能です。
可視化する時の都合上、ブートストラップ値は削除して、名前だけを残して変換後のNewickファイルを生成します。writeメソッドのformat引数を変えることにより書き出したい情報を取捨選択することができます。
コード
#!/usr/bin/env python3 import sys import ete3 def add_nodeID(nwk, out): tree = ete3.Tree(nwk) count = 1 for node in tree.traverse(): if node.is_root(): continue if node.is_leaf(): continue nodeID = "{}".format(str(count).zfill(3)) node.name = nodeID count += 1 with open(out, "w") as out: result = tree.write(format=3) print(result, file=out) if __name__ == '__main__': newick = sys.argv[1] outfile = sys.argv[2] add_nodeID(newick, outfile)