GGRNAを試す

ある短いオリゴの配列が1000本くらいあって、ソレがどの遺伝子に由来する配列なのかを調べる必要ができた。なんで由来が分からないんだよ!ってのは、まあ事情があるので、しょうがない。
普通に考えるとblast+を使えば良いかと思うんだけれど、フルマッチの配列のみを取り出したいし、GeneSymbolとEntrezのGeneIDを取り出したいという要求もあるので、普通にNCBIからrefseq_rna等をダウンロードして使うのも問題がある*1
せっかくなので、GGRNAを利用してみることにした。

RESTとJSONを使う

GGRNAは、APIが公開されているので、RESTでrequestして、結果をJSONで得ることができる。
例えば、「GGCGCTAAAAGTTTTGAGCTTCTCAAAAGTCTAGAGCCACCGTCCAGGGAGCAGGTAGCTGCTGGGCTCC」という配列をGGRNAで検索してJSONを得るためには、次のようなrequestを投げれば良い。


http://ggrna.dbcls.jp/api/hs/seq:GGC...(略)...TCC.json

perlだとこんな感じ。

my $seq = "GGCGCTAAAAGTTTTGAGCTTCTCAAAAGTCTAGAGCCACCGTCCAGGGAGCAGGTAGCTGCTGGGCTCC";
my $url="http://ggrna.dbcls.jp/api/hs/seq:" . $seq . ".json";
my $browser = WWW::Mechanize->new;
$browser->get($url);
my $content = $browser->content();

すると、だいたい、以下のようなJSONのテキストが返ってくる。

{"summary":[{"keyword":"seq:GGCGCTAAAAGTTTTGAGCTTCTCAAAAGTCTAGAGCCACCGTCCAGGGAGCAGGTAGCTGCTGGGCTCC","count":"5"},{"keyword":"[AND]","count":"5"}],"version":"GGRNA : RefSeq release 54 (20120713)","time":"2012-09-03 15:59:43","results":[{"snip":"..... cctcccatgtgctcaagactggcgctaaaagttttgagcttctcaaaagtctagagccaccgtccagggagcaggtagctgctgggctccggggacactttgcgttcggg .....","geneid":"7157","symbol":"TP53","version":"NM_000546.5","sequence_position":"position 40 (CDS: 203 - 1384) ","definition":"Homo sapiens tumor protein p53 (TP53), transcript variant 1, mRNA.","refid":"NM_000546"},{"snip":"..... cctcccatgtgctcaagactggcgctaaaagttttgagcttctcaaaagtctagagccaccgtccagggagcaggtagctgctgggctccggggacactttgcgttcggg .....","geneid":"7157","symbol":"TP53","version":"NM_001126112.2","sequence_position":"position 40 (CDS: 200 - 1381) ","definition":"Homo sapiens tumor protein p53 (TP53), transcript variant 2, mRNA.","refid":"NM_001126112"},{"snip":"..... cctcccatgtgctcaagactggcgctaaaagttttgagcttctcaaaagtctagagccaccgtccagggagcaggtagctgctgggctccggggacactttgcgttcggg .....","geneid":"7157","symbol":"TP53","version":"NM_001126113.2","sequence_position":"position 40 (CDS: 203 - 1243) ","definition":"Homo sapiens tumor protein p53 (TP53), transcript variant 4, mRNA.","refid":"NM_001126113"},{"snip":"..... cctcccatgtgctcaagactggcgctaaaagttttgagcttctcaaaagtctagagccaccgtccagggagcaggtagctgctgggctccggggacactttgcgttcggg .....","geneid":"7157","symbol":"TP53","version":"NM_001126114.2","sequence_position":"position 40 (CDS: 203 - 1228) ","definition":"Homo sapiens tumor protein p53 (TP53), transcript variant 3, mRNA.","refid":"NM_001126114"},{"snip":"..... cctcccatgtgctcaagactggcgctaaaagttttgagcttctcaaaagtctagagccaccgtccagggagcaggtagctgctgggctccggggacactttgcgttcggg .....","geneid":"7157","symbol":"TP53","version":"NM_001126118.1","sequence_position":"position 40 (CDS: 437 - 1501) ","definition":"Homo sapiens tumor protein p53 (TP53), transcript variant 8, mRNA.","refid":"NM_001126118"}]}

このJSON正規表現を使いこなしてparseする必要は...ない。CPANJSON関連のパッケージが大量にあるから、それを使えばいいはずだ。だけれど、何を使ったら良いのかよく分からない。雑に「use JSON;」だけしてみたり、こっちのほうが早いという評判を聞いて「use JSON::XS;」で実行してみると、何故かmalformed JSONと呼ばれる。よく分からないので、検索した結果からコピペしてみた*2ら、ちゃんとparseできた。

use JSON -support_by_pp;
my $json = JSON->new;
my $json_text = $json->allow_nonref->utf8->relaxed->escape_slash->loose->allow_singlequote->allow_barekey->decode($content);
my %genes=();
foreach my $c(@{$json_text->{results}}){
    $genes{$c->{geneid}}=$c->{symbol};
}
while(my ($key, $value) = each (%genes)){
    print "$key = $value\n";
}

コレを実行すると、上記の配列のGeneSymbolがTP53でそのGeneIDは7157だということが分かる。

実行してみた結果

レスポンスも一瞬ですばらしい。これはコピペスクリプトが良いのもあるんだろうけれど、何よりもサーバーのレスポンスがイイんだろうと思う。自前のダサいPCでstandalone blastを動かせるようにしてああだこうだするよりも、ずっとイイ。もっと前から知っておくべきだった。

んで

このGeneIDを使って、あらかじめダウンロードしてsqlite3のDBにつっこんでおいたgene_infoやらgene2accessionやらgene2goやらgene2ensemblで芋づる式にあれこれデータを引っ張れば、あっという間に「ソレっぽいアノテーションテーブル」の出来上がり。

*1:問題があるって言い切っちゃうのも問題があるんだけれど、refseq_rnaのblast結果からのid行をparseしてもGeneSymbolとかGeneIDとか取れないので、さらにソコから検索をかける必要があるのがメンドイ。

*2:このmethod chainをどうやったら呼ぼうと思えるというか判断できるのかがよく分からない。