Newick形式ファイルをPretty Printで整形したい

前回示したように、Newick形式は目で見て編集するにはあまり可読性が良くない。
そこで、何とか見やすく表示させるために、Pretty Printな整形をおこなえば良いと考えた。

 

Pretty Printとは

Wikipedia英語版によると、

プログラムのソースコードや、マークアップ言語等を整形する方法の1つ。インデントを加えたり色をつけたり、サイズを合わせたりすること

とのこと。例えば、Perlなどのプログラムのソースコードの場合、基本的に途中に改行やスペース、タブが入っていても無視されるので、

while (a<100){if (a==10){print "true";}else{print "false";}a=a+1;}exit;

というスクリプトを見やすくするには、

while (a<100) {
    if(a==10){
        print "true";
    }else{
        print "false";
    }
    a=a+1;
}
exit;

と表示させて、条件分岐の起点やループ範囲、処理内容を見やすくする。

また、プログラムに読みこませるデータ形式の一つであるjson形式*1 でも、プログラムと同様に途中に改行やスペース、タブが入っていても無視されるので、

{"Data name" : "personal data","list" : [{"name":"Mike","age":10},{"name":"Shiro","age":5}, {"name":"Buchi","age":8}]}

という情報を見やすくするために、

{
    "Data name" : "personal data",
    "list" : [
        {
            "name":"Mike","age":10
        },
        {
            "name":"Shiro","age":5
        },
        {
            "name":"Buchi","age":8
        }
    ]
}

と表示させ、改行とインデントと整形で、同じクラスのデータ、並記されているデータを見やすくする*2
ソースコードも機械可読データも、

  • 「改行を入れて意味のある最小単位ごとに行を分ける」
  • 「インデント(タブやスペース)を入れて、並列関係の情報は同じ階層、包含関係のある情報は別の階層に記述させる」

ようにして可読性を高めている。

 
Newick形式のPretty Print表示

だから、Newick形式も

(((A:d1,B:d2)0.13:d3,C:d4)0.99:d5,D:d6);

のような場合は、

(
    (
        (
            A:d1,
            B:d2
        )0.13:d3,
        C:d4
    )0.99:d5,
    D:d6
);

のように表示するよう工夫してはどうだろうか?
これなら、下記のような系統樹を、Newick形式からもイメージしやすくなると考えられる。

 

f:id:kiliwave:20161120182328p:plain

「姉妹群の開始部分(」「クレード1単位」「姉妹群の終了部分)」ごとに改行を挿入し、同じ姉妹群の行は同じ階層になるよう整形することとした。

この変換と復元を行うツールをPerlで作成した。
1. newick形式のファイルをPrettyPrintに整形する
https://github.com/muzina/newick_editor/blob/master/newick2ppEX.pl
2. PrettyPrintに整形したファイルを元のnewick形式に戻す。
https://github.com/muzina/newick_editor/blob/master/pp2newickEX.pl

1.と同じディレクトリにnewick形式のファイルを置いて、スクリプトを実行すると、Prettyprint整形されたファイルが出力される。

実行すると最初に

Do you need the depth information ? (y/n)

と聞かれるが、yの場合は階層情報を1カラム目に記述する。
インデントはタブで行われるが、それ以外の文字が良い場合は、75行目の

my $mono="\t";#indent monomer

の\tを別の文字に変えるとそれがインデントの単位となる。

Prettyprint整形されたファイルと同じディレクトリで、2.のスクリプトを実行すると、元のnewick形式に復元される。

これを使えば、先述の多分岐への編集処理なども若干やりやすくなるかもしれない。
将来はWebインターフェースで実装したい(希望)。

 

参考情報

以下の資料で勉強させていただいた。

 

以上。