3日目資料(2006/08/25)

配列・文字列の Origin
生物情報科学実験Ⅰ
„
∼ショットガンアセンブリ∼ Day3
1-origin
{
„
0-origin
{
([email protected])
„
Java VM に対してオプションを与える
{
-Xmx オプション。Java VM が使用してよい
メモリー量の最大値を設定する
„
„
最初の要素を 0 番目と定義する
(コンピューターで良く使うのはこちら)
0123456789
CCTATGCTAG
東京大学大学院 新領域創成科学研究科 特任助手
笠原 雅弘
Java で大量のメモリーを使う方法
最初の要素を 1 番目と定義する
(日常生活で良く使うのはこちら)
0-origin で数えると2文字目
0-origin で数えると0文字目
Eclipse で javaVMに
オプションを与える方法
„
Run する時に
VM arguments
に書き込む
例)512Mバイト使用許可してHelloWorldクラス
を起動
java -Xmx512m HelloWorld
例)2Gバイト使用許可してHelloWorldクラスを起
動
java -Xmx2G HelloWorld
1
Table of Contents 今日の流れ
訂正
„
1日目資料スライド52で、後藤のアルゴリズム
の解説で Ix と Iy が逆になっていました。
{
{
„
Ix[i][j] S2 にギャップが入って終わるアラインメント
の最適スコア
Ix[i][j] S1 にギャップが入って終わるアラインメント
の最適スコア
„
„
アフィンギャップスコア
„
„
n個の連続ギャップに対して スコア e(n-1)+d
ギャップを伸張(extension)するスコアは e を使うことが多
い
動的計画法の問題点
配列サイズが大きくなると破綻する
{
„
„
シーディング
ハッシュテーブルとは
ハッシュテーブルの構築法
課題提出方法
1日目資料スライド50のd と e も逆です
{
„
„
動的計画法に対する考察
„
データベース配列 D の長さを m, 問い合わ
せ配列 Q の長さを n とすると計算時間は
mn に比例する
データベース配列や問い合わせ配列の
量が多い場合には計算時間を短縮する
必要がある
観察:たいていのアラインメント問題は
「よく保存されている部分」を持っている
{
„
例)現在実験対象の遺伝子配列をシークエンスした。
ゲノム配列と照らし合わせて遺伝子構造を決定した
い。このとき、シークエンスの先頭と末尾付近は
シークエンスエラーに富むが内部はゲノム配列に
100%近くマッチする
事実:「よく保存されている部分」は速く検索し
見つけ出すことができる
{
100%近くマッチする文字列は、k-mer 整数を使った
比較や、ハッシュテーブル(後述)、接尾辞配列(こ
の実験では触れない)などで高速に見つけ出すこと
ができる
2
シーディング(Seeding)
„
連続k-merシード
シード(Seed)を使って動的計画法の計算
領域を狭める
配列1
„
連続(consecutive)な k-mer をシードとする
{
{
„
シード
DP空間
ハッシュテーブル(Hash table)
連続 k-merの位置を格納し素早く呼び出せるようにした
記憶構造
{
Overlapping/non-overlapping k-mer のどちらを記憶するかは
用途によって一長一短だが、この演習ではoverlapping k-mer を
記憶する
AAA
AAC
索引 AAG
:
:
:
想定する塩基一致率(Identity)が高い場合長く
低い場合短く
ACCGCCTATACTAGTCTTGACGATCTTCT
|||||X||||||||||X|||||X||||||
ACCACTTATACTAGTCATGACGTTCTTCT
配列2
„
11-merがお手頃でよく使われる
長さは通常 7-∼32-mer の範囲
配列 S3 の 154 文字目
配列 S5 の 23 文字目
配列 S5 の 541 文字目
:
:
配列 S0 の 71 文字目
:
:
:
概念図
連続10-mer マッチのシード
配列中の位置を表す
SequencePosition クラス
„
k-mer の存在位置を配列の番号と先頭からの位置を
セットで保存
{
以下の例では k=3 としている
S0:CCTATGCTAGTC
S1:CACGACAGCTTATCTA
S2:TTCCAGGCTGTACTACGAC
S3:ATCGTGATGTTAATCGGA
(0, 0)
(2, 3)
※全配列を連結し、先頭からの位置のみを記録する方法も提案され
ているが、ここでは扱わない。
3
ハッシュテーブルの構造
索引配列
ハッシュテーブルの引きかた
„
位置格納配列
k-mer 整数 位置格納配列上での開始位置
0
0
1
2
14
31
:
:
:
(3,154)
1
(5, 23)
2
(5, 541)
索引配列
開始位置
14
(0, 71)
15
(4, 18)
16
(18, 251)
TACCT
:
791
142716
792
142719
:
:
k-mer整数 0 が出現する回数
k-mer整数 0,1 が出現する回数
k-mer整数 0,1,2 が出現する回数
142716
(23, 434)
142717
(71,48)
142718
(121,145)
142719
(11,130)
142720
(81, 132)
TACCT
の存在
する位置
ハッシュテーブルの作り方(2/3)
„
索引Iを作る手順
{
常にゼロ
次のk-mer
の開始位置
793
{
索引配列 I
0
14
31
59
位置格納配列
:
まず、索引配列 I を作ることを考えよう
0
1
2
3
下記の例は “TACCT” (k-mer 整数で 791) を引く場合
{
0
ハッシュテーブルの作り方(1/3)
„
引きたい k-mer の k-mer整数を i とすると、索引配列
の i 番目が指す先から i + 1 番目が指す先の直前
各 k-mer の出現頻度をカウントし、配列Fとする
Fの partial sum 配列を I とする
出現頻度配列 F
0
1
2
3
:
14
17
28
:
:
索引配列 I
0
1
2
3
0
14
31
59
:
4
ハッシュテーブルの作り方(3/3)
„
索引Iを作るときの注意
{
位置格納配列が分かった
„
索引Iは 4k+1個の要素を持たせる
TT・・・・TTを引くときを例外扱いする必要を無くす為
„
位置格納配列P
索引配列 I
0
1
TTTTTTTTTTTT
:
16777215
16777216
索引配列I
0
1412154
:
1326864321
1326852189
格納中ポインタを作り
位置格納配列を作成する
„
観察
手順
{
{
索引Iが完成すると、各k-merに対応する
SequencePositionをどこに格納すれば良い
かが分かる
„
格納位置配列Tを作り、索引Iから要素をコピーする
データベース配列を前からスキャンし、現れた kmer について、ポインタを進める
„
格納位置配列Pが完成したときにTは、
各 k-mer に対応する SequencePositionブロックの最
後(正確にはブロック最後の次の要素)を表している
一列ずらしてしまえば索引配列 I とほとんど同じ
位置格納配列P
位置格納配列P
格納中ポインタ配列T
格納中ポインタ配列T
格納する
(234, 2457)
1つ進める
5
メモリーを節約する
格納中ポインタ配列Tを
„
通常とは逆順でPを作ればTは不要
{
{
ブロックの最後+1を指す索引配列を先に作る
データベースをスキャンし、現れた k-mer について
„
位置格納配列P
ハッシュテーブルへの改良
„
„
HashTable.java を実装せよ
{
索引を1減らし、位置格納配列に位置を書き込む
索引配列I
„
必須課題3-1
{
{
ひな形プログラムは実験2日目のプロジェク
トに含まれている
メモリー節約法を使用すること
ソースプログラム HashTable.java 及び動
作していることが分かる簡単な実行例を提
出せよ
リピート配列のマスク
配列中に特に頻出の配列は検索の役に立たな
いことが多く、位置格納配列Pから除外しておく
と検索高速化の役に立つことが多い
リピート配列のマスク
非連続シード
CGTACGTT
CGTACGTA
CGTACGTC
CGTACGTG
CGTACGTT
CGTACTAA
CGTACTAC
CGTACTAG
6
7
7
185
7
4
7
CGTACGTT
T回以上出現する頻出k-merをマスクする
(Tは時と場合に応じて上手く設定する)
6
非連続シード
„
連続していない k 文字をシードとする
{
{
必須課題3-2
„
n 文字, 1文字分の隙間, n 文字のパターンを
シードとする方式を 1-mid-spaced-seed と呼ぶ
隙間を除いたシードの文字数をシードの「重み(weight)」と呼
ぶ。1-mid-spaced-seed の重みは 2n である
1-mid-spaced-seedについて以下の問いに答えよ
{
{
„
{
1-mid-spaced-seed (例)
{
ACCGCCTATACTAGTCTTGACATCTTCTAG
||||X|||||X|||||X||||X||||||X|
ACCAACTATAGTAGTCATGACTTCTTCTCG
{
{
„
連続10-mer シードの代わりに重み10の
1-mid-spaced seed を使ったハッシュ
テーブルを作成せよ
{
„
細かな条件は必須課題3-1と同様とする
更に、ユーザーが与えるスレッショルド値
Tに対して、T回以上現れるシードをハッ
シュテーブルに格納しないプログラムを
作成せよ
議論を簡単にするために挿入欠失は全くなかったものとする
S1, S2 の間に最小で何塩基の変異が導入されると 10-mer 連
続シードが残っていない状態となるか
S1, S2 の間に最小で何塩基の変異が導入されると重み 10 の
1-mid-spaced seed が残っていない状態となるか
1-mid-spaced seed を使うことの利害得失について論ぜよ
注意:プログラムを作成する必要はない
ACCGCCTATACTAGTCTTGACATCTTCTAG
||||X|||||X|||||X||||X||||||X|
ACCAACTATAGTAGTCATGACTTCTTCTCG
利点)連続シードと比べて長い k をシードとすること
ができる
応用課題3-3
ゲノム配列中に 100-mer の配列S1があり、太古の昔に重複
して配列 S2 が登場した
数百万年の間に S1, S2 に変異が蓄積した
チャレンジ課題3-4
„
任意の形の隙間を入れた重み6のシードの中
について以下の問いに答えよ
{
{
ゲノム配列中に 60-mer の配列S1があり、太古の
昔に重複して配列 S2 が登場した
数百万年の間に S1, S2 に変異が蓄積した
„
„
{
各塩基はこの間に確率 p で変異すると仮定する
議論を簡単にするために挿入欠失は全くなかったものとす
る
どのような形のシードを使えば、重み6のシードが
残っている確率が最大となるか調べよ
„
必要ならそれを証明するプログラムを書き、実行すること
7
課題提出について
„
URL
„
„
report3 として提出すること
必須課題〆切
„
応用課題〆切
„
チャレンジ課題〆切
„
提出方法は基礎(Java)コースと同じ
{
{
{
{
{
http://mlab.cb.k.u-tokyo.ac.jp/~mkasa/upbsb2006/
8月30日14時45分
9月6日10時00分
9月18日10時00分
分からない場合には質問
8