[BioRuby-ja] 混合塩基

Toshiaki Katayama ktym @ hgc.jp
2006年 9月 8日 (金) 04:48:05 UTC


遠藤様

On 2006/09/08, at 1:26, 遠藤 大二 wrote:

> Nishiyamaさん
>
> ありがとうございました。
>
>>> 複数の塩基配列すべてについて、 mRNA上での局在を検索する。
>>
>> ここでいうmRNAというのは塩基配列既知のものということですよ ね?
> その通りです。
>
>> 正規表現で文字列を検索することで場所が分かるはずなので、
>> そのまま、正規表現で検索すれば良いように思うのですが、
>
> 実際にやってみると、正規表現で検索すると、かなり時間がかかるばかりでなく、相
> 手が長大な配列の場合ハングアップしてしまいました。
> このことを最初に書くべきでした。すみません。


BioRuby の Bio::Sequence では扱う配列全体をメモリに載せる方法しか
提供していませんので、そういうことも起こるかもしれないですね。
参考までに配列の長さとメモリの量を教えて頂けますか?


正規表現で検索してマッチした位置と部分配列を全部調べるのはあまりキレイに
書けない気がしてきました。

  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

片山


> それに対して単純な完全マッチの場合は、検索スピードが速く、また、MySQLの検索
> 式 "Where C like '%ACCGC%'
> などという検索をするとデータが大きくても検索が確実に可能でした。
>
> それで、可能な塩基配列すべてを生成するメソッドが必要になったというわけです。
>
>
> とはいえ、せっかくのご提案なので、もう一度、正規表現のままでの検索を実施して
> みます。
>
> では。
>
>
>> それでは不足でmismatchを許した検索をしたいということでしょ うか?
>> --
>> Tomoaki NISHIYAMA
>>
>> Advanced Science Research Center,
>> Kanazawa University,
>> 13-1 Takara-machi,
>> Kanazawa, 920-0934, Japan
>>
>>
>> On 2006/09/05, at 1:09, 遠藤 大二 wrote:
>>
>>> 酪農学園大学の遠藤と申します。
>>> オルソローグをHomologeneから入手して、共通のアミノ酸配列 からプライマーを設計
>>> するためのスクリプトを作成しています。
>>> 共通のアミノ酸配列を選択して、コドンテーブルに基づいて混合塩基 を予測するとこ
>>> ろまではできましたが、
>>> その混合塩基を含む配列のmRNA上の局在を決定する段階で問題 が生じました。
>>> HomologeneではProtein, mRNAともにFASTAフォーマット でのみダウンロードが可能で
>>> あるため、ORFの位置を決めることが私にはできません。
>>> それで、
>>> 混合塩基を含む配列をキーとして、mRNA配列上での局在位置を 検索したいと思いま
>>> す。
>>> 混合塩基から正規表現を生成するメソッドはあるようなのですが、正 規表現から複数
>>> の塩基配列を生成するメソッドというのはないでしょうか。
>>>
>>> WATCRYGGG → [A,T]ATC[A,G][T,C]GGG → [AATCATGGG,  AATCACGGG, .....]
>>>
>>> 複数の塩基配列を生成できれば、それらの配列すべてについて、 mRNA上での局在を検
>>> 索することができるので、プライマーとして働く位置が複数ある可能 性も含めて、確
>>> 認が可能になります。
>>>
>>> なにとぞご教示ください。
>>>
>>> _________________________________________________________________
>>> 借りるから購入、リフォームまで住宅の総合サイト MSN 住宅  http://house.msn.co.jp/home.armx
>>>
>>
>
> _________________________________________________________________
> 節約のアイディア300例。お金の悩みは、MSN マネーで自己解決 http://plan.money.jp.msn.com/saving/index.html 




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