[BioRuby-ja] FW: Re: 混合塩基

遠藤 大二 dendoh @ hotmail.co.jp
2006年 9月 8日 (金) 15:52:14 UTC


片山様

問題点のご指摘と解決策をありがとうございました。

 >>> 混合塩基複数の塩基配列すべてについて、 mRNA上での局在を検索する。問題に
ついてのスレッドです
> >>
>BioRuby の Bio::Sequence では扱う配列全体をメモリに載せる方法しか
>提供していませんので、そういうことも起こるかもしれないですね。
>参考までに配列の長さとメモリの量を教えて頂けますか?

混合塩基はmRNA検出用のプライマーとして設計して使用したいと考えていますので、
検索対象は、UnigeneかEnsEmblの特定の動物種のmRNA全部です。
Unigeneの場合、2kbase程度の配列30,000個を順次 MySQL/Rubyで取り込んで処理し
ます。

メモリは2GB積んで、SUSE linux でプログラムを実行しています。

取り込んだ塩基配列上での検索のメソッドは現在下記のコードを使っています。
tmp配列に取り込んだ結果をMySQL/RubyでMySQLに検索結果として格納しています。

もっと効率の良い方法を探してみます。

では。

+----------------------------------------
seq="(塩基配列)"
tmp=[]
pos = 0
nlocal=0
while nlocal do		
  nlocal=gstr.index("#{seq}",pos+1)
  if nlocal then 
   tmp << [oligo_id,greg_id,nlocal,1]
   pos = nlocal 
  end	
end
+----------------------------------------

>
>
>正規表現で検索してマッチした位置と部分配列を全部調べるのはあまりキレイに
>書けない気がしてきました。
>
>   seq.scan(pattern) do |match, offset|
>     ...
>   end
>
>みたいなことができればいい(MatchData の配列を返してくれる scan があればい
い?)
>のですが、実際には Ruby の String#scan は位置を返してくれないので、
>
>   longseq.scan(pattern) do |hit|
>     p longseq.index(hit)
>     p hit
>   end
>
>として index で調べる(無駄だし同じパターンは最初の index しかとれない)と
か、
>グローバル変数の $~ を使って
>
>   longseq = Bio::Sequence::NA.new("atgc" * 10000).randomize
>   pattern = Bio::Sequence::NA.new("WATCRYGGG").to_re
>
>   longseq.scan(pattern) do |hit|
>     p $~.offset(0)
>     p hit
>   end
>
># $~ は Regexp.last_match と同じで、最後にマッチした際の MatchData オブジェ
クトを
># 指していて、offset の先頭位置だけを返す begin メソッドも持っているので
>#「$~.offset(0)」は「Regexp.last_match.begin(0)」などとしてもいい感じ。
>
>とするといった工夫が必要ですが、scan メソッドは pattern のマッチする場所ど
うしが
>オーバーラップしている場合は取りこぼすようです。
>
>たとえば "attattatta".scan("atta") だと2つ目の "atta" の最初の a が1つ目
と
>重なっているので取らないみたい。
>
><pre>
>   "attattatta"
>    ^^^^ これを取ると
>       ^^^^ こっちは重なっているのでスキップされる
>          ^^^^ これは重なってないので再び取れる
></pre>
>
>ということで、マッチ開始位置を自前で管理する
>
>   i = 0
>   while hit = longseq[i,longseq.length].match(pattern)
>     i += hit.begin(0) + 1
>     puts i, hit.to_s
>   end
>
>とか、strscan を使って
>
>   require 'strscan'
>
>   s = StringScanner.new(longseq)
>
>   while s.skip_until(pattern)
>     s.pos = s.pos - s.matched_size + 1
>     puts s.pos, s.matched
>   end
>
>とする方法などがありそうです。
>
>以上、後藤さんに IRC で教えて頂きながら試行錯誤したのでメモ代わりに
>流しておきます。もっとカッコイイ方法があれば教えてください>all
>
>片山

_________________________________________________________________
節約のアイディア300例。お金の悩みは、MSN マネーで自己解決 
http://plan.money.jp.msn.com/saving/index.html 




BioRuby-ja メーリングリストの案内