Transcript slide3
9 / 5, 6 (3, 4日目)
生物情報科学実験2
プロテインチップ
森下研究室
佐々木 伸
([email protected])
レポート提出先・データおよび配付資料
この実験のレポート提出先は、
http://mlab.cb.k.u-tokyo.ac.jp/~sesejun/upbsb/jikken/2005/report/protein/
となります。提出方法はこれまでの実験と同様です。
「レポート1」から提出してください。
実験1でとった質量波形データおよび、この実験の資料やソフトウェ
アなどは、
http://mlab.cb.k.u-tokyo.ac.jp/~ssksn/upbsb/
にありますので、適宜ダウンロードしてください。
ソースコードは、印刷物では配布しません。上記のホームページ上に
あるものをダウンロードしてください。
キーボードをタイプして入力するにはコード量が多いので、ダウンロード
したファイルからコピーするなどしてください
ペプチド検索システムの構築
データベースファイルのダウンロード
実験資料ホームページ上にある、
small_database.xml
middle_database.xml
large_database.xml
の3つのファイルをダウンロードして、プロジェクトの直下
に入れておいて下さい。
ペプチド検索システムの構築
『システム全体としての仕様』を考えてみる
入力 : 複数の質量データ(Doubleの配列)
ファイルから
いくつかの検索条件設定
最大ミスカット数
許容質量誤差
データベース
ユーザの入力ではなく、システム側で読み込んでおく
複数のタンパクデータ(Proteinの配列)
出力 : データベース中の各タンパクデータについて入力質量データを
マッチさせてみた結果
タンパクAの結果、タンパクBの結果、タンパクCの結果、…
どんなペプチドが、どの程度の誤差で、どの入力データに、どれだけマッチしたか
ペプチド検索システムの構築
次に、『システム内で使われるデータ構造』の仕様につ
いて考える。
入力データ
質量を表す浮動小数であるのでjava自体のDouble型で表すこととする。また、複数の
データが入力されるので、Double型の配列で、入力データとすることとする
タンパク
データベースに格納されているタンパクのデータを表すデータ構造として、Proteinクラスと
いうものを作ることとする。
Proteinクラスは、
アミノ酸配列を表すString
と、
タンパクの名前を表すString
の2つの情報を内部に持つ。
データベースは、複数のタンパクデータから成るので、Protein型の配列をデータベースと
して扱うこととする
ペプチド検索システムの構築
次に、『システム内で使われるデータ構造』の仕様につ
いて考える。
ペプチド
タンパクを制限酵素で切断したペプチドを表すデータ構造として、
Peptideクラスというものを作ることとする。
Peptideクラスは、
アミノ酸配列を表すString と、
そのペプチドは何箇所のミスカットポイントを持っているかを表すint、
それから元となったタンパクのアミノ配列中のどこからどこまでの部分の
ペプチドであるかを表す情報
を持つ。
また、このシステムでは入力された質量データと、ペプチドの分子量を比
較することによって検索を行うので、ペプチドの分子量を返すメソッド
getMass()を持つ
ペプチド検索システムの構築
次に、『システム内で使われるデータ構造』の仕様について考える。
ペプチドの検索結果
ある1つの入力質量データに対して、あるペプチドがマッチしたことを表す
データ構造としてResultOfPeptideクラスを作る。
このデータ構造は、
Double型の入力質量データ
と、
Peptide型のマッチしたペプチドの情報
を内部に持つ。
タンパクの検索結果
複数の入力質量データを、あるタンパクに検索してみた結果を表すデータ構
造としてResultOfProteinクラスを作る。
このデータ構造は、
Doubleの配列として入力データを表し、
どの入力はマッチしたかマッチしなかったかを表すbooleanの配列 と、
マッチした全てのペプチドについてのResultOfPeptideの配列 と、
検索されたタンパクを表すProteinの情報
を内部に持つ。
ペプチド検索システムの構築
このシステム中では、検索やsortを行うので、その
『Comparatorについての仕様』を考える。
入力データが、どのペプチドの分子量とマッチしているのかを
searchしたいので、入力データ(Double型)とペプチド(Peptide
型)を順序づけ出来るComparatorが欲しい
PeptideComparator
データベースについて処理を行った結果出てきた検索結果、
ResultOfProteinについて、どの結果が”良い”結果なのか順序を
つけたいので、ResultOfProteinの順序づけを行うComparator
が欲しい
ResultComparator
ペプチド検索システムの構築
システムの処理の流れから、メソッドの仕様と呼び出しの流れを考
える
入力データの読み込み
loadFromFileメソッド
入力ファイル名を受け取って、ファイルから浮動小数のデータを読み込む
入力 : String 入力ファイル名
出力 : Double[] 入力質量データ
ペプチド検索システムの構築
システムの処理の流れから、メソッドの仕様と呼び出しの流れを考
える
データベースのロード
loadDataBaseメソッド
入力 : String データベース名
出力 : Protein[] タンパクのデータベース
ペプチド検索システムの構築
システムの処理の流れから、メソッドの仕様と呼び出しの流れを考える
メインの検索部
searchDataBaseメソッド
入力質量データ、データベース、最大ミスカット数、許容質量誤差を受け
取ってデータベース中の各タンパクについて処理を行う
入力
Double[] 入力質量データ
Protein[] データベース
int 最大ミスカット数
double 許容質量誤差
出力
ResultOfProtein[] データベース中の各タンパクについての検索
結果
データベース中の全タンパクについてループする
ペプチド検索システムの構築
システムの処理の流れから、メソッドの仕様と呼び出しの流れを考える
メインの検索部
searchProteinメソッド
入力質量データ、タンパク、最大ミスカット数、許容質量誤差を受け取って
各入力質量ピークについて処理を行う
入力
Double[] 入力質量データ
Protein 検索タンパク
int 最大ミスカット数
double 許容質量誤差
出力
ResultOfProtein このタンパクについての検索結果
全入力質量ピークについてループする
ペプチド検索システムの構築
システムの処理の流れから、メソッドの仕様と呼び出しの流れを考える
メインの検索部
searchPeaksメソッド
入力質量ピーク、ペプチド配列、許容質量誤差を受け取って入力質量ピークにマッ
チするペプチドを全て列挙する
入力
Double 入力質量ピーク
Peptide[] 検索対象の全てのペプチド
double 許容質量誤差
出力
ResultOfPeptide[] この入力質量ピークにマッチする全てのペプチド
全ペプチドについてループする
searchDataBaseからseachProteinを呼び出し、searchProteinから
searchPeaksを呼び出すが、それぞれどんな入力を渡され、どんな出力を返
すのか考えて実装する
ペプチド検索システムの構築
データ構造等の仕様を決めたところで、必要となる「部品」メソッドは
ないか考える
部品メソッドは、基本的にはProteinChipクラスのstaticメソッドと
して実装する
Peptideクラスの分子量を返すメソッドgetMass()は、アミノ配列を
表すStringを入力すると、その配列の分子量が得られる
computeMass(String)という「部品」があると良い
computeMass(String)は、アミノ残基を表すchar1文字を入力
すると、そのアミノ酸の分子量が得られる
computeMass(char)という部品があると良い
ペプチド検索システムの構築
メソッドの仕様
computeMass(char)メソッド
渡されたアミノ酸を表す文字に対応する分子量を返すメソッド
入力 : char アミノ酸を表す文字
出力 : double 入力されたアミノ酸の分子量
computeMass(String)メソッド
渡されたアミノ酸を表す文字列に対応する分子量を返すメソッド
入力 : String アミノ酸を表す文字列
出力 : double 入力されたアミノ酸配列の分子量
computeMass(char)は、他のメソッドには依存しないのでこのメソッドから始
めると作業を進めやすい
ペプチド検索システムの構築
テストファースト
ショットガンアセンブラの演習で触れられたと思いますが、プログラム
を書く場合のテクニックとして、メソッド本体よりも先にテストコードを
書くという技法があります。
単体(ユニット)テスト
「部品」を使ってメソッドを作る場合、そのメソッドが上手く動かなかっ
たとき、「部品」そのもの自体が上手く動いていないのか、それとも
「部品」の使い方が悪かったのかが分かりにくい。しかも複数の「部
品」を使うような場合は、さらに状況は複雑となってしまう。
そこで、「部品」を組み上げて上位のメソッドを作る前に、「部品」メ
ソッドが出来た時点で、その「部品」メソッドをテストしてみて、その
「部品」そのものはきちんと動くと言うことを確認するようにすると良い
例 testComputeAminoMass()
ペプチド検索システムの構築
Proteinクラスの方に関しても、「部品」が必要とならな
いか考えてみる
Proteinからトリプシン処理によって、複数の
Peptide(Peptideの配列)に変換するようなメソッドが必要
さらに、このメソッドは最大ミスカットまでのミスカットを考慮し
たPeptideを作る必要がある
ペプチド検索システムの構築
メソッドの仕様
getSegmentedPeptideWithMaxMissCutメソッド
Proteinから、最大ミスカットまでのミスカットを考慮した全てのPeptideの配列を返す
getSegmentedPeptideWithMissCutメソッドを、ミスカット数を0から最大ミスカットまで変えつつ呼
び出して、その全ての出力をまとめる
入力 : Protein 切断されるタンパク, int 最大ミスカット数
出力 : Peptide[] 出来うる全てのペプチド
getSegmentedPeptideWithMissCutメソッド
ミスカット0で切断されたPeptideの配列から、指定されたミスカット数のPeptide配列を返す
入力 : Peptide[] ミスカット0で順番に切断されたペプチドの配列、int 指定ミスカット数
出力 : Peptide[] 指定されたミスカット数のペプチドの配列
getSegmentedPeptideByTrypsinメソッド
Proteinから、トリプシン処理によってミスカット0で出来るペプチドの配列を返す
元のタンパクのアミノ配列のそのままの順番で配列に格納して返す
入力 : Protein 切断されるタンパク
出力 : Peptide[] ミスカット0のペプチドの配列(元のアミノ配列と同じ順番に格納されている)
実装・仕様上の注意点
computeMass(String)メソッド
アミノ酸が繋がるときはペプチド結合で繋がる
ペプチド結合が生じる際には…?
実装・仕様上の注意点
Peptideクラス
元のタンパクのアミノ配列中の位置を表すstartResidueと、
endResidueは0から始まって、(特にendResidueの方は
重要なことだが)そのインデックスの残基までを含む部分を
表している
例
元のタンパク “mkwvtfisllllfssaysrgv…”
ペプチド
“mk” startResidue 0,
endResidue 1
従って、隣あったペプチド同士は、startResidueと
endResidueの差は1という関係にある
実装・仕様上の注意点
Peptideクラスのコンストラクタ
Peptide(Peptide p1, Peptide p2)
ペプチドp1とペプチドp2を繋げた配列を持つペプチドを作る
ペプチドp1とペプチドp2は、元のタンパクのアミノ配列上で
隣り合っていなければならない
2つのペプチドを繋げるということは、繋げる元となる2つの
ペプチドのミスカット数と新しくできるペプチドのミスカット数
の関係はどうなるか?
実装・仕様上の注意点
getSegmentedPeptideByTrypsin(Protein)メソッ
ド
引数に与えられたProteinのアミノ配列をトリプシン処理で切
断したとして得られるペプチドを返す
トリプシン処理とは、”K”(リジン)か”R”(アルギニン)が配列
中にあったら、その隣で切断する
注
大文字だけとは限らない…
このメソッドでは、トリプシン処理で切断できるポイントがあっ
たら全て切断する。つまりミスカット数が0のペプチドを作る
すなわち、この処理で返される全てのペプチドの末端のアミ
ノ残基は…?ただし、一つのペプチドだけ例外があるかも
実装・仕様上の注意点
getSegmentedPeptideByTrypsin(Protein)メソッ
ド <続>
切断されたペプチドは、元のタンパクのアミノ配列と同じ順番
で配列に格納されて返される
例
元のProteinのアミノ配列
mkrsstvlaallalllvatndaarhrkyrqty
返されるペプチド配列
[0] [1]
[2]
[3] [4] [5] [6]
mk, r, sstvlaallalllvatndaar, hr, k, yr, qty
実装・仕様上の注意点
getSegmentedPeptideWithMissCut(Peptide[], int)メソッド
完全に切断された(ミスカット数0の)ペプチド配列を受け取って、指
定されたミスカット数のペプチドを全て生成して返すメソッド
入力されるミスカット数0のペプチドの個数をN個、指定されたミス
カット数がMとすると、このメソッドが作って返すペプチドの個数は
(N-M)個(ただし、NがMより大きいときのみ。もし(N-M)が0以下
になったら、要素が0個の配列を返すようにすればよい)
例 (実装のヒント?)
入力ペプチド配列
[0] mk, [1] r, [2] sstvlaallalllvatndaar, [3] hr, [4] k, [5]
yr,[6] qty
指定ミスカット数を”1”とすると、作られるペプチドは、
mk + r, r + sstvlaallalllvatndaar, sstvlaallalllvatndaar +
hr, hr + k, …
実装・仕様上の注意点
getSegmentedPeptideWithMaxMissCut(Peptide[], int)メ
ソッド
getSegmentedPeptideWithMissCut(Peptide[], int)メソッド
と似ているが、先ほどのは指定されたミスカット数のみのペプチドを
作って返したが、このメソッドは指定された「最大ミスカット数」の全
てのペプチドを返す
つまり、指定ミスカット数を変えながら
getSegmentedPeptideWithMissCut(Peptide[], int)メソッド
を呼んでやると…?
レポート3
1.
2.
3.
testComputeAminoMass() を参考にして、 computeMass(String) メソッドの
挙動をチェックするためのtestComputeSequenceMass() メソッドを完成さ
せなさい。
computeMass(String) メソッドを実装しなさい。
(オプション課題1)
getSegmentedPeptideByTrypsin(Protein) メソッド
getSegmentedPeptideWithMissCut(Peptide[], int)メソッド
getSegmentedPeptideWithMaxMissCut(Peptide[], int)メソッド を
1つ以上実装しなさい。
4.
(オプション課題2) 問題1以外のメソッドについても、テストメソッドを
1つ以上作りなさい。
レポート提出期限
9月6日24時(7日0時)