Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2008-01-06

Bio::DB::SeqFeature::Store の feature.object を ruby から読みたい

|  Bio::DB::SeqFeature::Store の feature.object を ruby から読みたい - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  Bio::DB::SeqFeature::Store の feature.object を ruby から読みたい - KazusaAPI開発日誌  Bio::DB::SeqFeature::Store の feature.object を ruby から読みたい - KazusaAPI開発日誌 のブックマークコメント

Bio::DB::SeqFeature::Store は GFF3 を RDB に格納するためのクラス類です。GFF3 で導入された、選択的スプライス産物などの階層的な feature の取扱いが可能になっている。

Bio::DB::SeqFeature::Store は Bio::DB::GFF と同等またはそれ以上のインターフェイスをもっていて、今後のゲノムアノテーションはこちらを利用するのが主流になっていくのかな、と。とくに真核生物については GFF3 で扱いたいだろうから、そうなるでしょう。

Bio::DB::SeqFeature::Store のテーブルスキーマは、9 個のテーブルから構成されてる。基本的に feature テーブルが中心的なテーブルになっている。

+----------------------+
| attribute            |
| attributelist        |
| feature              |
| locationlist         |
| meta                 |
| name                 |
| parent2child         |
| sequence             |
| typelist             |
+----------------------+

feature テーブルにはつぎのフィールドがある。

+---------+------------+------+-----+---------+----------------+
| Field   | Type       | Null | Key | Default | Extra          |
+---------+------------+------+-----+---------+----------------+
| id      | int(10)    | NO   | PRI |         | auto_increment |
| typeid  | int(10)    | NO   | MUL |         |                |
| seqid   | int(10)    | YES  | MUL |         |                |
| start   | int(11)    | YES  |     |         |                |
| end     | int(11)    | YES  |     |         |                |
| strand  | tinyint(4) | YES  |     | 0       |                |
| tier    | tinyint(4) | YES  |     |         |                |
| bin     | int(11)    | YES  |     |         |                |
| indexed | tinyint(4) | YES  |     | 1       |                |
| object  | mediumblob | NO   |     |         |                |
+---------+------------+------+-----+---------+----------------+

使用したデータは TAIR7。これを bp_seqfeature_load.pl でインポートすると、object が Perl の Storable で永続化したデータになる。

ここで次のデータのレコードに相当する object をみてみる。これらがひとつの feature になっている。

TAIR7_GFF3_transcripts.gff:Chr1 sim4 cDNA_match 25132551 25132808 . + . ID=cDNA_1_8752;Name=U23535;Note=gi:29028877;Alias=BT005883
TAIR7_GFF3_transcripts.gff:Chr1 sim4 cDNA_match 25132352 25132443 . + . ID=cDNA_1_8752;Name=U23535;Note=gi:29028877;Alias=BT005883
TAIR7_GFF3_transcripts.gff:Chr1 sim4 cDNA_match 25132107 25132252 . + . ID=cDNA_1_8752;Name=U23535;Note=gi:29028877;Alias=BT005883
TAIR7_GFF3_transcripts.gff:Chr1 sim4 cDNA_match 25131390 25131973 . + . ID=cDNA_1_8752;Name=U23535;Note=gi:29028877;Alias=BT005883

Storable のバイナリを無理矢理 ruby で読む。まず、ActiveRecord でモデルをつくる。

class Feature < ActiveRecord::Base
  set_table_name 'feature'

  belongs_to :typelist, :class_name => 'Typelist', :foreign_key => 'typeid'
  belongs_to :locationlist, :class_name => 'Locationlist', :foreign_key => 'seqid'
end

この Feature クラスをつかってレコードをとりだします。出力にはスペースを適当にいれてます。

>> p Feature.find(1).object.split("\n")
[
"\005\a\021\023Bio::DB::SeqFeature\003\000\000\000\r", 
 "\004sim4\000\000\000\006source\005\000\000\000", 
 "primary_id\005\000\000\000\005store", 
"\b25132808\000\000\000\004stop", 
 "\004Chr1\000\000\000\003ref", 
 "\006U23535\000\000\000\004name\005\000\000\000\005score\004\002\000\000\000\004\024\022\000\003\000\000\000\f", 
 "\004sim4\000\000\000\006source\005\000\000\000", 
 "primary_id", 
"\b25132808\000\000\000\004stop\005\000\000\000\005store", 
 "\004Chr1\000\000\000\003ref", 
 "\006U23535\000\000\000\004name\005\000\000\000\005score\005\000\000\000\005phase\b\201\000\000\000\006strand", 
"", 
 "cDNA_match\000\000\000\004type\004\003\000\000\000\003\004\002\000\000\000\002", 
 "\bBT005883", 
 "\vcDNA_1_8752\000\000\000\005Alias\004\002\000\000\000\001", 
 "\vcDNA_1_8752\000\000\000\aload_id\004\002\000\000\000\001", 
 "\vgi:29028877\000\000\000\004Note\000\000\000", 
 "attributes", 
"\b25132551\000\000\000\005start\024\022\000\003\000\000\000\f", 
 "\004sim4\000\000\000\006source\005\000\000\000\005store\005\000\000\000", 
 "primary_id", 
"\b25132443\000\000\000\004stop", 
 "\004Chr1\000\000\000\003ref", 
 "\006U23535\000\000\000\004name\005\000\000\000\005score\005\000\000\000\005phase\b\201\000\000\000\006strand", 
"", 
 "cDNA_match\000\000\000\004type\004\003\000\000\000\003\004\002\000\000\000\002", 
 "\bBT005883", 
 "\vcDNA_1_8752\000\000\000\005Alias\004\002\000\000\000\001", 
 "\vcDNA_1_8752\000\000\000\aload_id\004\002\000\000\000\001", 
 "\vgi:29028877\000\000\000\004Note\000\000\000", 
 "attributes", 
"\b25132352\000\000\000\005start\024\022\000\003\000\000\000\f", 
 "\004sim4\000\000\000\006source\005\000\000\000\005store\005\000\000\000", 
 "primary_id", 
"\b25132252\000\000\000\004stop", 
 "\004Chr1\000\000\000\003ref", 
 "\006U23535\000\000\000\004name\005\000\000\000\005score\005\000\000\000\005phase\b\201\000\000\000\006strand", 
"", 
 "cDNA_match\000\000\000\004type\004\003\000\000\000\003\004\002\000\000\000\002", 
 "\bBT005883", 
 "\vcDNA_1_8752\000\000\000\005Alias\004\002\000\000\000\001", 
 "\vcDNA_1_8752\000\000\000\aload_id\004\002\000\000\000\001", 
 "\vgi:29028877\000\000\000\004Note\000\000\000", 
 "attributes", 
"\b25132107\000\000\000\005start\024\022\000\003\000\000\000\f", 
 "\004sim4\000\000\000\006source\005\000\000\000\005store\005\000\000\000", 
 "primary_id", 
"\b25131973\000\000\000\004stop", 
 "\004Chr1\000\000\000\003ref", 
 "\006U23535\000\000\000\004name\005\000\000\000\005score\005\000\000\000\005phase\b\201\000\000\000\006strand", 
"", 
 "cDNA_match\000\000\000\004type\004\003\000\000\000\003\004\002\000\000\000\002", 
 "\bBT005883", 
 "\vcDNA_1_8752\000\000\000\005Alias\004\002\000\000\000\001", 
 "\vcDNA_1_8752\000\000\000\aload_id\004\002\000\000\000\001", 
 "\vgi:29028877\000\000\000\004Note\000\000\000", 
 "attributes", 
"\b25131390\000\000\000\005start\000\000\000\bsegments\005\000\000\000\005phase\b\201\000\000\000\006strand", 
"", 
 "cDNA_match\000\000\000\004type\004\003\000\000\000\003\004\002\000\000\000\002", 
 "\bBT005883", 
 "\vcDNA_1_8752\000\000\000\005Alias\004\002\000\000\000\001", 
 "\vcDNA_1_8752\000\000\000\aload_id\004\002\000\000\000\001", 
 "\vgi:29028877\000\000\000\004Note\000\000\000", 
 "attributes", 
"\b25131390\000\000\000\005start"
]

これをパタンマッチすると一応情報はとれる。きもちわるい。

まとめ

  1. Perl の Storable で nstore したものを、Ruby でバイナリのまま読むことは出来る。
  2. データとして読む方法があればいいけど、思いつく範囲では検索しても見つからなかった。
  3. Bio::DB::SeqFeature だけに特化したものは作れそうだから時間があいたら考えてみたい。
  4. 考え方をかえると、自分でデータをインストールする限りは、Storable を使わない形にレコードを格納すればよい。
トラックバック - http://kdri.g.hatena.ne.jp/nakao_mitsuteru/20080106