Hatena::Groupbioruby

"aac".translate #=> "N" このページをアンテナに追加 RSSフィード

2007-12-15

1_2_0_released*[Release] BioRuby 1.2.0 released

1_2_0_released*[Release] BioRuby 1.2.0 released - "aac".translate #=> "N" を含むブックマーク はてなブックマーク - 1_2_0_released*[Release] BioRuby 1.2.0 released - "aac".translate #=> "N" 1_2_0_released*[Release] BioRuby 1.2.0 released - "aac".translate #=> "N" のブックマークコメント

BioRuby 1.2.0 released.

2007-12-15 Toshiaki Katayama <k@bioruby.org>

* BioRuby 1.2.0 released

* BioRuby shell is improved

* file save functionality is fixed

* deprecated require_gem is changed to gem to suppress warnings

* deprecated end_form_tag is rewrited to suppress warnings

* images for Rails shell are separated to the bioruby directory

* spinner is shown during the evaluation

* background image in the textarea is removed for the visibility

* Bio::Blast is fixed to parse -m 8 formatted result correctly

* Bio::PubMed is rewrited to enhance its functionality

* e.g. 'rettype' => 'count' and 'retmode' => 'xml' are available

* Bio::FlatFile is improved to accept recent MEDLINE format

* Bio::KEGG::COMPOUND is enhanced to utilize REMARK field

* Bio::KEGG::API is fixed to skip filter when the value is Fixnum

* A number of minor bug fixes

http://cvs.open-bio.org/cgi-bin/viewcvs/viewcvs.cgi/bioruby/ChangeLog?rev=1.71&cvsroot=bioruby&content-type=text/vnd.viewcvs-markup

Three ways to install bioruby.

  1. tarball. http://bioruby.org/archive/bioruby-1.2.0.tar.gz
  2. cvs -d :pserver:cvs@code.open-bio.org:/home/repository/bioruby checkout
  3. gem install bio

ftonytqezvftonytqezv2013/07/28 13:00kspkucjpsvcz, <a href="http://www.bnxeapazrj.com/">nxbiakfzxn</a> , [url=http://www.tyrvlnucnc.com/]otajbquscy[/url], http://www.ztzadwciyf.com/ nxbiakfzxn

vakkrxtngpvakkrxtngp2013/07/30 17:50ptnygcjpsvcz, <a href="http://www.tbiepymyhi.com/">gmnictrtgd</a> , [url=http://www.yrsjmswify.com/]pvipvwrnqh[/url], http://www.rsrlvtkmlt.com/ gmnictrtgd

トラックバック - http://bioruby.g.hatena.ne.jp/nakao_mitsuteru/20071215

2007-10-10情報技術基礎I

情報技術基礎I

|  情報技術基礎I - "aac".translate #=> "N" を含むブックマーク はてなブックマーク -  情報技術基礎I - "aac".translate #=> "N"  情報技術基礎I - "aac".translate #=> "N" のブックマークコメント


第3回 2007年10月10日(水)

情報技術基礎I

 中尾 光輝 かずさDNA研究所

1 プログラミング基礎I

2 プログラミング基礎II

3 プログラミング基礎III

バイオインフォマティクスで扱う生命情報は膨大です。前回、コマンドラインからプログラムを操作する基本を学びましたが、自分で研究をするとき、ちょっとしたデータファイルフォーマット変換ができたり、欲しいデータのみを思い通りに抽出できたりするととても便利です。そのためにはやはり自分でプログラミングができるとよいでしょう。今回はプログラム言語Rubyの基本を学び、バイオデータを自ら操作してみます。

http://training.cbrc.jp/modules/tinyd3/index.php?id=7

もくじ

この講習のあとにはこんなことができるようになります

  1. プログラミング学習のための調査
  2. 塩基配列アミノ酸配列翻訳する
  3. 配列パターン検索する

はじめに

この講義では、90分三コマでバイオインフォマティクス系のプログラミングの基礎を学習します。参加者は、基本的なシャルの操作やテキストエディタの操作が出来ていることが前提です。実習は KNOB (Knoppix for Bio) を利用しておこないます。KNOB には必要なソフトウェアがすべてインストール済みなので、インストールにかかわる手間が省けます。

screenshot

講義は、本ページのコードを実際に実行しながらすすめます。必要なコードターミナルコピーペーストして実行できるように、このページをウェブブラウザで開き、その隣りにターミナルウィンドウを配置しておくと良いでしょう。

プログラミング学習では、道具(ターミナルテキストエディタ)の慣れが学習効果にとても影響します。テキストエディタキーボードに十分なれていると良いでしょう。

プログラミング学習は、強いモチベーションがあると進みます。本講義では、基本的なことを駆け足で紹介するにとどまるので、本講義によってすぐにプログラミングができるようにはなりませんが、プログラミング学習することの道しるべを示すことができればという位置づけ準備しました。本講義のあとに 40 時間ほどかけて、プログラミング言語の入門書を読み、コードを写し、実行することが必要です。そのための助けになる概念形成と必要なドキュメントを紹介します。

プログラミング基礎I Ruby入門

|  プログラミング基礎I Ruby入門 - "aac".translate #=> "N" を含むブックマーク はてなブックマーク -  プログラミング基礎I Ruby入門 - "aac".translate #=> "N"  プログラミング基礎I Ruby入門 - "aac".translate #=> "N" のブックマークコメント

プログラミング言語 Ruby の基本的を紹介します。プログラミング言語 Ruby は文字列操作や複雑なデータ構造やデータ操作が比較的手軽にできます。

はじめに、文字列や数値の扱いを紹介します。

文字列 String

文字列の生成
"Hello Bio"

ダブルクォートで囲まれたものが文字列になります。

"ACGT"
文字列を変数 str に代入
str = "Hello Bio"
str の内容を表示
puts str #=> "Hello Bio"

puts をつかうと文字列の内容を表示することができます。

コメント

行の # 以降はコメントになります。コメントプログラムには影響を与えません。

# これはコメント
dna = "ACGT" # ここもコメント

コードを実行したときに期待される画面表示を #=> につづけて表します

dna = "ACGT"
puts dna #=> "ACGT"

bioruby シェル

ここからは、bioruby シェルという対話的プログラミング環境で実際にコードを実行しながらすすめます。

bioruby コマンドを実行する(ターミナルのプロンプト $ に bioruby入力してリターンキーを押す)と、次のような表示になります。

ターミナル入力

bioruby

△実行結果

$ bioruby↓
Loading config (shell/session/config) ... done
Loading object (shell/session/object) ... done
Loading history (shell/session/history) ... done

. . . B i o R u b y   i n   t h e   s h e l l . . .

  Version : BioRuby 1.1.0 / Ruby 1.8.5

bioruby> 
bioruby コマンドの終了方法

入力

exit

△実行結果

bioruby> exit↓


. . . B i o R u b y   i n   t h e   s h e l l . . .

Saving object (shell/session/object) ... done
Saving config (shell/session/config) ... done
Leaving directory '.'
History is saved in './shell/session/history'

exit で終了します。ここではリターンキーを「↓」で表現しています。なお、これで終了できないときは、コントロールキーとcキーを同時に押してみてください。

bioruby シェルのより詳しい紹介は BioRuby の使い方の BioRuby シェルの項目を参照ください。

screenshot

▼先ほど紹介した文字列の変数への代入を bioruby シェルで試してみます。

"Hello Bio"

△実行結果

bioruby> "Hello Bio"
  ==> "Hello Bio"

bioruby シェルでは行単位Rubyコードを実行できます。bioruby> に続いてコード入力してリターンキーをおすとそのコードが実行できます。実行するとその行の値が表示されます。この場合では、文字列の自身が表示されています。

▼文字列の変数への代入

str = "Hello Bio"

△実行結果

bioruby> str = "Hello Bio"
  ==> "Hello Bio"

変数の表示

puts str

△実行結果

bioruby> puts str
Hello Bio
  ==> nil

文字列を変数に代入し、puts で表示しました。ここでの nil はその行の自体(puts str)の値を指しています。

▼複数行のペースト

# これはコメント
dna = "ACGT" # ここもコメント

△実行結果

bioruby> # これはコメント
bioruby+ dna = "ACGT" # ここもコメント
  ==> "ACGT"

複数行をペーストすると、bioruby> の表示に bioruby+ の表示がならびます。

それでは、文字列の説明にもどります。


文字列の長さ

▼文字列の長さは size メソッドで取得します。

"Hello Bio".size

△実行結果

bioruby> "Hello Bio".size
  ==> 9

▼文字列 "Hello Bio" を代入した変数 str でも size で文字列の長さがわかります。

str.size

△実行結果

bioruby> str.size
  ==> 9

コード

"ACGT".size
文字列の連結

▼+ で文字列を連結できます。

"Hello Bio" + "informatics" #=> "Hello Bioinformatics"

△実行結果

bioruby> "Hello Bio" + "informatics"
  ==> "Hello Bioinformatics"
文字列のくりかえし

▼ * で「文字列のかけ算」ができます。

"Hello Bio" * 3

△実行結果

bioruby> "Hello Bio" * 3
  ==> "Hello BioHello BioHello Bio"

コード

"ACGT" * 10

△実行結果

bioruby> "ACGT" * 10
  ==> "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT"
大文字にする

▼uppercase letter(大文字)にします。

"Hello Bio".upcase

△実行結果

bioruby> "Hello Bio".upcase 
  ==> "HELLO BIO"
小文字にする

▼lower case letter(小文字)にします。

"Hello Bio".downcase

△実行結果

bioruby> "Hello Bio".downcase 
  ==> "hello bio"

コード

"ACGT".downcase

△実行結果

bioruby> "ACGT".downcase
  ==> "acgt"
大文字小文字を入れ替える

case を入れ替えます。

"Hello Bio".swapcase

△実行結果

bioruby> "Hello Bio".swapcase 
  ==> "hELLO bIO"

写植活字を入れる箱(case)の置き方が大文字が棚の上(upper)で小文字が棚の下(lowwer)という習慣から命名されているようです。

反転

▼文字列を逆からにします。

"Hello Bio".reverse

△実行結果

bioruby> "Hello Bio".reverse 
  ==> "oiB olleH"

コード

"ACGT".reverse

△実行結果

bioruby> "ACGT".reverse
  ==> "TGCA"
文字置換

▼translateします。

"ACGT".tr("T", "U")

△実行結果

bioruby> "ACGT".tr("T", "U") 
  ==> "ACGU"

DNA 文字列を RNA 文字列にしました。

▼相補鎖にします。

"ACGT".tr("ACGT", "tgca")

△実行結果

bioruby> "ACGT".tr("ACGT", "tgca") 
  ==> "tgca"

DNA 文字列の相補鎖(3'->5')にしました。

反転と文字置換をくみあわせると DNA の相補鎖(5'->3')を計算することができます。

変数 dnaDNA文字列を代入します。

dna = "ACGT"

△実行結果

bioruby> dna = "ACGT"
  ==> "ACGT"

DNA 文字列の相補鎖(3'->5')にします。

dna.tr("ACGT", "tgca")

△実行結果

bioruby> dna.tr("ACGT", "tgca")
  ==> "tgca"

DNA 文字列の相補鎖(5'->3')にします。

dna.tr("ACGT", "tgca").reverse

△実行結果

bioruby> dna.tr("ACGT", "tgca").reverse
  ==> "acgt"

このように tr メソッドと reverse メソッドを連続して適用することもできます。


部分をとりだす

▼0文字目から2文字分とりだしています。

"ACGT".slice(0, 2)

△実行結果

bioruby> "ACGT".slice(0, 2) 
  ==> "AC"

プログラミング言語では番号は0からはじまります。

▼n文字目から2文字分とりだしています。

"ACGT".slice(1, 2)
"ACGT".slice(2, 2)
"ACGT".slice(3, 2)
"ACGT".slice(4, 2)

△実行結果

bioruby> "ACGT".slice(1, 2)
  ==> "CG"
bioruby> "ACGT".slice(2, 2)
  ==> "GT"
bioruby> "ACGT".slice(3, 2)
  ==> "T"
bioruby> "ACGT".slice(4, 2)
  ==> ""

最後の文字 T(3番目の文字)を超えた範囲では空文字 "" が返ります。


文字列を走査する

▼GTを走査する

dna = "ACGT" * 10
dna.scan("GT")

△実行結果

bioruby> dna = "ACGT" * 10
  ==> "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT"
bioruby> dna.scan("GT")
  ==> ["GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT"]

▼GTの数をかぞえる

dna.scan("GT").size

△実行結果

bioruby> dna.scan("GT").size
  ==> 10

置換

▼単語置換

"Hello Bio".sub("Bio", "Bioinformatics")

△実行結果

bioruby> "Hello Bio".sub("Bio", "Bioinformatics")
  ==> "Hello Bioinformatics"

▼単語置換は最初のマッチだけに作用します

"ACGTACGT".sub("GT", "gt")

△実行結果

bioruby> "ACGTACGT".sub("GT", "gt")
  ==> "ACgtACGT"

▼すべての単語置換をするには、gsub を使います。

"ACGTACGT".gsub("GT", "gt")

△実行結果

bioruby> "ACGTACGT".gsub("GT", "gt")
  ==> "ACgtACgt"

分割

▼空白文字一文字で分割します。

"Hello Bio".split(" ")

△実行結果

bioruby> "Hello Bio".split(" ")
  ==> ["Hello", "Bio"]

分割した結果は Array という複数の要素を扱うデータ構造になっています。Array については後ほど説明します。

▼空文字で分割すると、一文字毎に分割することができます。

"Hello Bio".split("")

△実行結果

bioruby> "Hello Bio".split("") 
  ==> ["H", "e", "l", "l", "o", " ", "B", "i", "o"]

コード

"ACGT".split("")

△実行結果

bioruby> "ACGT".split("") 
  ==> ["A", "C", "G", "T"]
文字列 String のまとめ
  1. 文字列 String の操作について簡単にふれました。
  2. 文字列 String にはほかにもおおくのメソッドがあります。それらを調べる方法は最後にまとめて解説します。

文字列 String のもっているメソッドを簡単に調べる方法をひとつ紹介します。

つぎのように空の文字列 "" にピリオド . をつづけ、そこでタブキーを二回押します。

bioruby> "".

△タブキーを二回押した結果実行結果

bioruby> "".
Display all 163 possibilities? (y or n)

ここで y キーを押すと、ピリオドのあとに続けることの出来るメソッド名のリストが表示されます。このリストはリターンキーでスクロールします。

△実行結果

                                  .instance_eval                    .select
.__id__                           .instance_of?                     .send
.__send__                         .instance_variable_defined?       .singleton_methods
.all?                             .instance_variable_get            .size
.any?                             .instance_variable_set            .skip
.between?                         .instance_variables               .slice
(以下省略)

これはメソッド名の補完と呼ばれる機能です。メソッド名を途中まで書いてタブキーをおすと候補がリストされます。

▼sからはじまるメソッド名ってなんだっけ?

bioruby> "".s

△sからはじまる候補リスト

.scan               .size               .sort               .squeeze!           .sub                .sum
.select             .skip               .sort_by            .step               .sub!               .swapcase
.send               .slice              .split              .strip              .succ               .swapcase!
.singleton_methods  .slice!             .squeeze            .strip!             .succ!     

この機能になれると非常に便利です。


数値 Fixnum, Float

数値は整数(Fixnum)と実数(浮動小数点 Float)があります。

一般的には、コンピュータで扱う数値には桁数などさまざまな制限があるので、精度を気にする必要があることを覚えておくと良いでしょう。

四則演算

▼足し算

1 + 1

△実行結果

bioruby> 1 + 1
  ==> 2

▼引き算

2 - 2

△実行結果

bioruby> 2 - 2 
  ==> 0

▼かけ算

4 * 4 * 4

△実行結果

bioruby> 4 * 4 * 4
  ==> 64

▼割り算

4 / 3

△実行結果

bioruby> 4 / 3
  ==> 1

整数整数の計算ではその結果は整数であることが期待されるので、割り算の定義が直感と異なり、整数部分だけが返ります。直感とおなじ結果にするには、実数(浮動小数点)Float をつかいます。

▼Float での割り算

4.0 / 3

△実行結果

bioruby> 4.0 / 3
  ==> 1.33333333333333

今日講義の総秒数(90分、3コマ)

90 * 3 * 60

△実行結果

bioruby> 90 * 3 * 60
  ==> 16200

このように、bioruby シェルは簡単な電卓にもなることが実感できたかとおもいます。


剰余 modulo

▼割り算の余りです。

10 % 2
11 % 2

△実行結果

bioruby> 10 % 2
  ==> 0
bioruby> 11 % 2
  ==> 1

偶数判定に利用できます。たとえば、テーブルの行の背景色を交互に替える場合などに利用できます。

一般的には、任意の周期で起こる動作を判定するのにたびたび利用されます。


divmod

▼割り算の商と余りの組みです。

10.divmod(3)
10.divmod(4)
10.divmod(5)

△実行結果

bioruby> 10.divmod(3)
  ==> [3, 1]
bioruby> 10.divmod(4)
  ==> [2, 2]
bioruby> 10.divmod(5)
  ==> [2, 0]

指数

▼** で指数計算ができます。

2 ** 8

△実行結果

bioruby> 2 ** 8
  ==> 256

対数

▼底が e の対数は Math.log を用います。

Math.log(2)

△実行結果

bioruby> Math.log(2)
  ==> 0.693147180559945

log や sin などの数学的な計算には Math モジュールを使用します。

▼底が 10 の対数は底の交換公式を思い出します。

Math.log(1000) / Math.log(10)

△実行結果

bioruby> Math.log(1000) / Math.log(10)
  ==> 3.0

\log_{10} 1000 = \frac{\log_e 1000}{\log_e 10}


数値への変換

▼文字列から整数への変換

"10".to_i

△実行結果

bioruby> "10".to_i
  ==> 10

to Integer という感じです。

▼文字列から浮動小数点 Float への変換

"10".to_f

△実行結果

bioruby> "10".to_f
  ==> 10.0

to Float という感じです。

▼数値(整数)から文字列への変換

10.to_s

△実行結果

bioruby> 10.to_s
  ==> "10"

▼数値(Float)から文字列への変換

10.0.to_s

△実行結果

bioruby> 10.0.to_s
  ==> "10"

to String という感じです。


計算の優先順位

▼数値の計算には優先順位があります。ここで紹介した範囲では、一般的な順位と同等です。

1 + 2 * 10

△実行結果

bioruby> 1 + 2 * 10 
  ==> 21

▼先に計算したい部分をカッコで囲います。

(1 + 2) * 10

△実行結果

bioruby> (1 + 2) * 10 
  ==> 30
数値のまとめ
  1. 数値には整数と実数(浮動小数点)があります。
  2. 四則計算で直感とことなる場合があります。
  3. 計算の優先順位はつぎのサイトに説明があります。
    1. プログラミング言語 Ruby リファレンスマニュアル

集合 Array, Hash

集合には配列 Array とハッシュ Hash があります。これらの違いは、要素単位、要素の取り出し方と順番の保存性にあります。また、Ruby は集合を比較的簡単にあつかうことが出来ます。

はじめに配列 Array を紹介します。

配列 Array の作成

[1, 2, 4, 8, 16]

△実行結果

bioruby> [1, 2, 4, 8, 16]
  ==> [1, 2, 4, 8, 16]

[ と ] で要素を囲み、要素間は , で区切ると配列 Array が作成できます。

配列 Array の要素には数値や文字列を混ぜることができます。

array = [1, 2.0, "DNA", "RNA"]

△実行結果

bioruby> array = [1, 2.0, "DNA", "RNA"]
  ==> [1, 2.0, "DNA", "RNA"]
要素の取り出し

▼要素は 0 番目からはじまります。これは添字(index)といいます。

array[0]

△実行結果

bioruby> array[0]
  ==> 1

コード例1

array[1]

△実行結果

bioruby> array[1]
  ==> 2.0

コード例2

array[2]

△実行結果

bioruby> array[2]
  ==> "DNA"

素数

▼文字列と同様に size で調べます。

array.size

△実行結果

bioruby> array.size
  ==> 4

要素の追加(後ろから)

▼要素を push します

array = [1, 2.0, "DNA", "RNA"]
array.push("Bio")
array

△実行結果

bioruby> array = [1, 2.0, "DNA", "RNA"]
  ==> [1, 2.0, "DNA", "RNA"]
bioruby> array.push("Bio")
  ==> [1, 2.0, "DNA", "RNA", "Bio"]
bioruby> array
  ==> [1, 2.0, "DNA", "RNA", "Bio"]
要素の取り出し(後ろから)

▼要素を pop します

array.pop
array

△実行結果

bioruby> array.pop
  ==> "Bio"
bioruby> array
  ==> [1, 2.0, "DNA", "RNA"]

このように、pushpop の動作は対称的になっています。


要素の取り出し(前から)

▼全体を shift します

array = [1, 2.0, "DNA", "RNA"]
array.shift
array

△実行結果

bioruby> array = [1, 2.0, "DNA", "RNA"]
  ==> [1, 2.0, "DNA", "RNA"]
bioruby> array.shift
  ==> 1
bioruby> array
  ==> [2.0, "DNA", "RNA"]
要素の追加(前から)

▼shift の逆です。

array.unshift(10)
array

△実行結果

bioruby> array.unshift(10)
  ==> [10, 2.0, "DNA", "RNA"]
bioruby> array
  ==> [10, 2.0, "DNA", "RNA"]

このように、shift と unshift の動作は対称的になっています。


要素のソート

▼sort でソートします。

array = ["A", "T", "G", "C"]
array.sort

△実行結果

bioruby> array = ["A", "T", "G", "C"]
  ==> ["A", "T", "G", "C"]
bioruby> array.sort
  ==> ["A", "C", "G", "T"]

ソートは昇順になります。降順やそれ以外の並べ方をすることもできます。それらの方法の調べからは後ほど紹介します。


次元配列

二次元配列を生成します。

d1 = ["A", "C", "G", "T"]
d2 = ["a", "c", "g", "t"]
marray = [d1, d2]

△実行結果

bioruby> d1 = ["A", "C", "G", "T"]
  ==> ["A", "C", "G", "T"]
bioruby> d2 = ["a", "c", "g", "t"]
  ==> ["a", "c", "g", "t"]
bioruby> marray = [d1, d2]
  ==> [["A", "C", "G", "T"], ["a", "c", "g", "t"]]

配列 Array の要素に配列 Array をいれることができます。すると、二次元配列になります。この方法はバイオインフォマティクスでは良く利用されるデータの持ち方です。

▼要素にアクセスします(1)

marray[0]

△実行結果

bioruby> marray[0]
  ==> ["A", "C", "G", "T"]

▼要素にアクセスします(2)

marray[1]

△実行結果

bioruby> marray[1]
  ==> ["a", "c", "g", "t"]

▼要素にアクセスします(3)

marray[1][0]

△実行結果

bioruby> marray[1][0]
  ==> ["a"]

▼要素にアクセスします(4)

marray[0][0]

△実行結果

bioruby> marray[0][0]
  ==> ["A"]
配列の要素を結合する

▼全要素を結合して文字列にします。

array = ["A", "T", "G", "C"]
array.join

△実行結果

bioruby> array = ["A", "T", "G", "C"]
  ==> ["A", "T", "G", "C"]
bioruby> array.join
  ==> "ATGC"

▼スペース(空白)文字一文字で結合します。

array.join(" ")

△実行結果

bioruby> array.join(" ") 
  ==> "A T G C"

▼前出したように Array#join の逆は String#split です。

array = ["A", "T", "G", "C"]
array.join("")
array.join("").split("")

△実行結果

bioruby> array = ["A", "T", "G", "C"]
  ==> ["A", "T", "G", "C"]
bioruby> array.join("")
  ==> "ATGC"
bioruby> array.join("").split("")
  ==> ["A", "T", "G", "C"]

ここまでで配列 Array について簡単に紹介しました。つぎにハッシュ Hash について説明します。


ハッシュ Hash

ハッシュ Hash の生成

hash = {"DNA" => "ACGT", "RNA" => "ACGU"}

△実行結果

bioruby> hash = {"DNA" => "ACGT", "RNA" => "ACGU"}
  ==> {"DNA"=>"ACGT", "RNA"=>"ACGU"}

ハッシュ Hash は key => value という組みの集合です。要素の取り出しは key でおこないます。{ と } で囲むと生成できます。

ハッシュ Hash は、「キー」と「値」の組みの集合なので、データベースエントリ(たとえば、名簿など)の内容を格納する場合などに利用できます。

要素の取り出し

▼要素の取り出し

hash["DNA"]

△実行結果

bioruby> hash["DNA"]
  ==> "ACGT"

▼要素の取り出し、その2

hash["RNA"]

△実行結果

bioruby> hash["RNA"]
  ==> "ACGU"

配列 Array では要素の番号から要素を取り出しましたが、ハッシュ Hash では「値」の「キー」でとりだします。


要素の追加

▼要素の取り出しと対称的にできます。

hash["Protein"] = "AminoAcids"
hash

△実行結果

bioruby> hash["Protein"] = "AminoAcids"
  ==> "AminoAcids"
bioruby> hash 
  ==> {"DNA"=>"ACGT", "RNA"=>"ACGU", "Protein"=>"AminoAcids"}
要素の値の変更

▼要素の取り出しと対称的にできます。

hash["DNA"] = "acgt"
hash

△実行結果

bioruby> hash["DNA"] = "acgt"
  ==> "acgt"
bioruby> hash 
  ==> {"DNA"=>"acgt", "RNA"=>"ACGU", "Protein"=>"AminoAcids"}

要素の追加と変更は同じ方法でできます。

要素の追加(その2)

hash.update({"Genome" => "DNA"})
hash

△実行結果

bioruby> hash.update({"Genome" => "DNA"})
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"ACGU", "Protein"=>"AminoAcids"}
bioruby> hash 
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"ACGU", "Protein"=>"AminoAcids"}
要素の値の変更(その2)

hash.update({"RNA" => "acgu"})
hash

△実行結果

bioruby> hash.update({"RNA" => "acgu"})
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"acgu", "Protein"=>"AminoAcids"}
bioruby> hash 
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"acgu", "Protein"=>"AminoAcids"}

要素の追加と変更は同じ方法でできます。


key の集合

▼キーの集合を取り出します。

hash
hash.keys

△実行結果

bioruby> hash
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"acgu", "Protein"=>"AminoAcids"}
bioruby> hash.keys
  ==> ["Genome", "DNA", "RNA", "Protein"]

ハッシュの性質として、keys の並び順は不定です。この場合では、["DNA", "RNA"] か ["RNA", "DNA"] かは決まってません。使用する計算機や環境によって変わります。

value の集合

▼値の集合を取り出します。

hash
hash.values

△実行結果

bioruby> hash
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"acgu", "Protein"=>"AminoAcids"}
bioruby> hash.values
  ==> ["DNA", "acgt", "acgu", "AminoAcids"]

ハッシュの性質として、values の並び順は不定です。

集合のまとめ
  1. 集合には配列 Array とハッシュ Hash があります。
  2. それらの良く利用するメソッドの紹介をしました。
  3. 値の追加や取り出しのメソッドには対称性があります。


プログラミング基礎II くりかえし、式、条件分岐、正規表現

|  プログラミング基礎II くりかえし、式、条件分岐、正規表現 - "aac".translate #=> "N" を含むブックマーク はてなブックマーク -  プログラミング基礎II くりかえし、式、条件分岐、正規表現 - "aac".translate #=> "N"  プログラミング基礎II くりかえし、式、条件分岐、正規表現 - "aac".translate #=> "N" のブックマークコメント

この章ではくりかえし、式、条件分岐、正規表現を紹介します。これらはバイオインフォマティクスにかぎらずプログラミングでは非常に良く利用されるものです。特に正規表現DNA配列を文字列をして扱う現場では必須のものです。また、ここではプログラミングに特有の概念を数多く紹介します。


くりかえし

繰り返しは、プログラミング言語 Ruby ではとても簡単におこなうことができます。

100 回くりかえす。

▼繰り返し単位

puts "Hello !"

△実行結果

bioruby> puts "Hello !"
Hello !
  ==> nil

▼これを 100 回くり返すには、つぎのようにします。

100.times { puts "Hello !" }

△実行結果

bioruby> 100.times { puts "Hello !" }
Hello !
Hello !
Hello !
Hello !
Hello !
(中略)
Hello !
Hello !
Hello !
Hello !
Hello !
  ==> 100

{ と } で囲まれるプログラム部分(この例では { puts "Hello !" })はブロックとよばれます。100.times は後ろにブロックをとり、それを 100 回くりかえします。ブロックRuby ではとても頻繁に利用されます。

ここは Ruby の面白いところの一つです。興味のある方はブロックに着目して Ruby の本を読んでみると良いでしょう。


100 回くりかえす、番号付き

▼100 回くりかえす、番号付き

100.times {|i| 
  puts "Hello ! " + i.to_s 
}

△実行結果

bioruby> 100.times {|i| 
bioruby+   puts "Hello ! " + i.to_s 
}
Hello ! 0
Hello ! 1
Hello ! 2
Hello ! 3
Hello ! 4
(中略)
Hello ! 95
Hello ! 96
Hello ! 97
Hello ! 98
Hello ! 99
  ==> 100

100.times は繰り返し回数の番号を提供しています。 | と | の間の変数 i に繰り返し番号を繰り返しのたびに代入します。繰り返し回数は 0 からはじまります。

とにかくある回数くり返したいというときは times が便利です。


配列 Array の要素をひとつづつ表示する

集合の要素をひとつづつ評価したいというときは each をつかいます。

▼each を使います。

array = [0, 1, 2, 3, 4]
array.each {|x|
  puts x
}

△実行結果

bioruby> array = [0, 1, 2, 3, 4]
  ==> [0, 1, 2, 3, 4]
bioruby> array.each {|x|
bioruby+   puts x
}
0
1
2
3
4
  ==> [0, 1, 2, 3, 4]

このように、each をつかうと配列 Array の要素をひとつづつ評価することができます。

配列の要素をそれぞれ二乗して出力します。

array.each {|x|
  puts x ** 2
}

△実行結果

bioruby> array.each {|x|
bioruby+   puts x ** 2
}
0
1
4
9
16
  ==> [0, 1, 2, 3, 4]

これをふたたび配列に戻すこともできます。それには map を使います。

map を使います。

array.map {|x|
  x ** 2
}

△実行結果

bioruby> array.map {|x|
bioruby+   x ** 2
}
  ==> [0, 1, 4, 9, 16]

each のかわりに map をつかいます。map写像のことです。

map の結果を array2 に代入します。

array
array2 = array.map {|x|
  x ** 2
}
array2

△実行結果

bioruby> array
  ==> [0, 1, 2, 3, 4]
bioruby> array2 = array.map {|x|
bioruby+   x ** 2
}
  ==> [0, 1, 4, 9, 16]
bioruby> array2
  ==> [0, 1, 4, 9, 16]

このように map配列 Array のそれぞれの要素に同じ操作をおこなうことができ、非常に便利です。一連のデータを変換するということを抽象化しています。


添字付きの each

配列 Array の添字(index)を同時に使いたいときは each_with_index を使います。

array.each_with_index {|x, i|
  puts [i.to_s, x.to_s].join(" ")
}

△実行結果

bioruby> array.each_with_index {|x, i|
bioruby+   puts [i.to_s, x.to_s].join(" ")
}
0 0
1 1
2 2
3 3
4 4
  ==> [0, 1, 2, 3, 4]

ハッシュ Hash の要素をひとつづつ評価する

▼each を使います。

hash = {"DNA" => "ACGT", "RNA" => "ACGU"}
hash.each {|key, value|
  puts [key, value].join(" ")
}

△実行結果

bioruby> hash = {"DNA" => "ACGT", "RNA" => "ACGU"}
  ==> {"DNA"=>"ACGT", "RNA"=>"ACGU"}
bioruby> hash.each {|key, value|
bioruby+   puts [key, value].join(": ")
}
DNA: ACGT
RNA: ACGU
  ==> {"DNA"=>"ACGT", "RNA"=>"ACGU"}
くりかえしのまとめ
  1. くりかえしでは each が中心的な役割をになっています。
  2. 配列 Array でもハッシュ Hash のどちらでも each がつかえます。
  3. 集合の要素全体への操作(写像)は map でおこないます。

式とは、プログラム単位です。プログラムは式で構成されます。いままで実習でコピーペーストしてきたものはすべて式です。

基本的に、式は値を返します。いままで bioruby> プロンプトでコードを実行した結果、 ==> につづく表示は式の値です。

▼式 "ACGT"

"ACGT"

△実行結果

bioruby> "ACGT"
  ==> "ACGT"

式 "ACGT" の値は "ACGT" です。

▼式 dna = "ACGT"

dna = "ACGT"

△実行結果

bioruby> dna = "ACGT"
  ==> "ACGT"

▼式 puts dna

puts dna

△実行結果

bioruby> puts dna
ACGT
  ==> nil

puts dna の値は nil です。nil は特別な値で、空(カラ)を表現します。

式のまとめ
  1. 実は式をコピーペーストしてました。
  2. nil は空の値です。

条件分岐

条件分岐は、プログラムの中の処理を制御構造です。条件に関係する真偽判定と、分岐の制御構造について紹介します。


真偽判定

条件分岐には、真偽判定を利用します。式の値として真偽を取るものがあります。真には true、偽には false が値として利用します。

▼比較、大小

1 < 2

△実行結果

bioruby> 1 < 2
  ==> true

▼比較、大小

1 > 2

△実行結果

bioruby> 1 > 2
  ==> false

▼比較、大小、一致を含む

1 <= 1

△実行結果

bioruby> 1 <= 1
  ==> true

▼比較、大小、一致を含む

1 >= 2

△実行結果

bioruby> 1 >= 2
  ==> false

▼比較、一致、不一致

1 == 1

△実行結果

bioruby> 1 == 1
  ==> true

▼比較、一致、不一致

1 != 2

△実行結果

bioruby> 1 != 2
  ==> true

if

条件分岐は、if が基本です。同じ変数の内容で多数の分岐条件を扱うときは caseをつかいます。

▼条件分岐には、if を用います。次の例は、塩基配列の文字列を一文字づつ評価して、"A" のときに "Adenine." と出力するプログラムです。

dna = "ACGT"
dna.split("").each {|nucleotide|
  if nucleotide == "A" then
    puts "Adenine."
  end
}

△実行結果

bioruby> dna.split("").each {|nucleotide|
bioruby+   if nucleotide == "A" then
    puts "Adenine."
  end
}
Adenine.
  ==> ["A", "C", "G", "T"]

さて、このプログラムでは、nucleotide == "A" という条件節(if nucleotide == "A")を評価して、"A" なら "Adenine." を出力し、そうでないならなにもしない、という動作をします。

▼"A" のときの条件節を確認します。

nucleotide = "A"
nucleotide == "A"

△実行結果

bioruby> nucleotide = "A"
  ==> "A"
bioruby> nucleotide == "A"
  ==> true

一致判定 == で true が返っています。

▼"T" の場合の条件節を確認します。

nucleotide = "T"
nucleotide == "A"

△実行結果

bioruby> nucleotide = "T"
  ==> "T"
bioruby> nucleotide == "A"
  ==> false

一致判定 == で false が返っています。

このように条件節の真偽値で評価されて、条件分岐の if で利用されています。if では条件節が true の場合に then のつづき(ここでは、puts "Adenine." )を実行します。

if-else

条件分岐で規定(どの条件でも true でなかった場合)の動作を用意したいことがあります。そのときには、if-then-else をつかいます。else 以下が規定の動作になるので、すべての条件節で true にならないときは else 以下に分岐します。

▼"A" のときには puts "Adenine." を、それ以外には puts "Others." を実行します。

dna = "ACGT"
dna.split("").each {|nucleotide|
  if nucleotide == "A" then
    puts "Adenine."
  else
    puts "Others."
  end
}

△実行結果

bioruby> dna = "ACGT"
  ==> "ACGT"
bioruby> dna.split("").each {|nucleotide|
bioruby+   if nucleotide == "A" then
    puts "Adenine."
  else
bioruby+     puts "Others."
  end
}
Adenine.
Others.
Others.
Others.
  ==> ["A", "C", "G", "T"]

case-when

変数の値によって分岐するような場合は,条件の数が少ないときはよいのですが、if-then-else だと煩雑になりがちです。

▼そのような場合は、case-when で多数の条件を分岐します。

dna = "ACGT"
dna.split("").each { |nucleotide|
  case nucleotide
  when "A","G"
    puts "Purine."
  when "C","T","U"
    puts "Pyrimidine."
  end
}

△実行結果

bioruby> dna = "ACGT"
  ==> "ACGT "
bioruby> dna.split("").each { |nucleotide|
bioruby+   case nucleotide
  when "A","G"
    puts "Purine."
  when "C","T","U"
    puts "Pyrimidine."
  end
}
Purine.
Pyrimidine.
Purine.
Pyrimidine.
  ==> ["A", "C", "G", "T"]

case-when も if と同様に else を使うことができます。

when のあとにつづく文字列だけではありません。このあとに説明する正規表現も利用できます。それはのちほど説明します。


条件分岐のまとめ
  1. 真偽値は特別な値 true と false
  2. 真偽値は比較で返る
  3. ちょっと複雑な分岐は case-when で簡単になることがある。

正規表現

正規表現は文字列の操作において、とても重要なものです。正規表現は文字列の集合の表現方法です。たとえば、「アルファベットの小文字全部」は [a-z] で表現できます。

正規表現をつかうとできること
  1. 配列中のモチーフを検索できる。
  2. 文字列中から情報を抜き出す。

DNA配列大文字小文字)で長さ一文字以上
/[ACGTacgt]+/

マッチする例

"acgt" =~ /[ACGTacgt]+/

△実行結果

bioruby> "acgt" =~ /[ACGTacgt]+/
  ==> 0

マッチのある場合は、マッチした位置を返します。

[ACGTacgt] が、それらのなかの一文字を表現し、+ が一文字以上を表現しています。したがって、/[ACGTacgt]+/ は「ACGTacgtのなか文字が一文字以上つづく文字列」の正規表現です。正規表現は / と / で囲まれたものとして利用できます。

ここでは、文字種と長さが別の記号で表現されていることを押さえてください。

マッチしない例

"bbbb" =~ /[ACGTacgt]+/

△実行結果

bioruby> "bbbb" =~ /[ACGTacgt]+/
  ==> nil

マッチしない場合は、nil を返します。

文字種
  • 文字全体を表現する記号は、\w です。文字全体以外を表現するのは、\W です。
  • 数値全体を表現する記号は、\d です。数値以外全部を表現するのは、\D です。
  • それ以外の文字(スペース、タブ、改行など)を表現するの記号は、\s です。それ以外以外を表現するのは、\S です。

任意の一文字を表現するのは、. です。

長さ
  • 一文字以上は +
  • 零文字以上は *
  • 長さ指定は {長さ}
  • 長さ範囲指定は {最低長,最高長}
さらに位置情報の記号もあります。
  • 先頭 ^
  • 最後尾 $

▼標準遺伝コードでの終止コドンの正規表現

stop_codon = /U(A[AG]|GA)/
"UAA" =~ stop_codon
"UAG" =~ stop_codon
"UGA" =~ stop_codon
"AUG" =~ stop_codon

△実行結果

bioruby> top_codon = /U(A[AG]|GA)/
  ==> /U(A[AG]|GA)/
bioruby> "UAA" =~ stop_codon
  ==> 0
bioruby> "UAG" =~ stop_codon
  ==> 0
bioruby> "UGA" =~ stop_codon
  ==> 0
bioruby> "AUG" =~ stop_codon
  ==> nil

/U(A[AG]|GA)/ の解説をします。

  1. 終止コドンは "UAA", "UAG", "UGA" の三種類あります。
  2. 三種類の文字列のうちどれかという正規表現では /(UAA|UAG|UGA)/ になります。
    1. | が or を表現し、() でグルーピングされています。(文字列のグルーピング
  3. つぎに、終始コドンがすべて U からはじまっているので、それを /U(AA|AG|GA)/ と表現できることがわかります。
  4. コドンの二文字目が共通の終止コドン UAA と UAG もまとめると、/U(A[AG]|GA)/ になりました。(文字のグルーピング
    1. A[AG] は AA もしくは AG という意味になります。

このように、正規表現マッチする対象の文字列がおなじでも、表現方法がいくつもあります。より短い正規表現をつくることは職人芸的なものが必要になる場合もあります。

正規表現は、文字のマッチに利用します。文字のマッチを使う場合は、

  1. 文字列の置換(gsub, sub
  2. 文字列の検出(scan
  3. 真偽判定(if、case-when、=~)

があげられます。

たとえば、十分長い文字列がDNA配列RNA配列であるのかを判定するようなプログラムではつぎのようになります。

case sequence
when /^[ACGT]+$/
  puts "DNA"
when /^[ACGU]+$/
  puts "RNA"
end

DNA の場合

sequence = 'ACTG' * 100
case sequence
when /^[ACGT]+$/
  puts "DNA"
when /^[ACGU]+$/
  puts "RNA"
end

△実行結果

bioruby> sequence = 'ACTG' * 100
  ==> "ACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTG"
bioruby> case sequence
when /^[ACGT]+$/
  puts "DNA"
when /^[ACGU]+$/
  puts "RNA"
end
DNA
  ==> nil

DNA に判定されました。


RNA の場合

sequence = 'AUCG' * 100
case sequence
when /^[ACGT]+$/
  puts "DNA"
when /^[ACGU]+$/
  puts "RNA"
end

△実行結果

bioruby> sequence = 'AUCG' * 100
  ==> "AUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCG"
bioruby> case sequence
when /^[ACGT]+$/
  puts "DNA"
when /^[ACGU]+$/
  puts "RNA"
end
RNA
  ==> nil

RNA に判定されました。


マッチした文字列の取得

マッチした文字列はマッチ変数 $1〜9 に格納されます。

if position = "acgtttttgagtggtaccgttttat" =~ /([acgt]gt)/
  p position
  p $1
end

△実行結果

bioruby> if position = "acgtttttgagtggtaccgttttat" =~ /([acgt]gt)/
  p position
  p $1
end
1
"cgt"
  ==> nil

/([acgt]gt)/ にマッチする文字列は、1番目の位置の文字(二文字目)からの cgt というのがわかりました。

でも、ほかにもマッチしそうな文字列があります。

▼複数のマッチする文字列をすべて取得するには、scan をつかいます。

matches = "acgtttttgagtggtaccgttttat".scan(/([acgt]gt)/)
p matches

△実行結果

bioruby> matches = "acgtttttgagtggtaccgttttat".scan(/([acgt]gt)/)
  ==> [["cgt"], ["agt"], ["ggt"], ["cgt"]]
bioruby> p matches
[["cgt"], ["agt"], ["ggt"], ["cgt"]]

scan をつかえば、終止コドンになりそうな部分の列挙が出来ることが想像できると思います。

正規表現のまとめ
  1. 正規表現は文字列の集合の表現方法。
  2. 文字種と長さと位置は別の記号になっている。
  3. マッチした位置と文字列を取得できる。

まとめ

|  まとめ - "aac".translate #=> "N" を含むブックマーク はてなブックマーク -  まとめ - "aac".translate #=> "N"  まとめ - "aac".translate #=> "N" のブックマークコメント

この講義では、バイオインフォマティクス向けのプログラミングの基礎を扱いました。基本的なデータ構造(文字列、数値、集合)と制御構造(真偽判定、くりかえし、分岐)、正規表現を扱いました。

講義のあとにみるべき参考資料

ここまででプログラミングについての概念形成ができているので、プログラミングの入門書を40時間ほどかけて、コードを書き写して実行しながら読み進むことをおすすめします。

書籍

O’Reilly Japan - 初めてのプログラミング

この書籍の元になった文章はつぎのページです。

BioRuby について知りたいとき
正規表現にもうすこしついて知りたいとき
プログラムの書き方

プログラムは一定のルールにのっとって書くとあとで見返したときに読み易いです。

ほかの人の書いたソースコードを参考にするとき

ほかの人の書いたソースコードを読むことはたいへん勉強になります。そのときの手助けになるのは、ソースコード検索サービスです。バイオインフォマティクス用のソースコード検索サーバb-srcGoogleの公開ソースコード検索エンジンを紹介します。

You-KeyYou-Key2007/11/17 07:36KNOB をマックOS Xに ダウンロードしたのですが、その後どのようにして使ったら良いのかわかりません。
Parallel virtual system も つかっています。基本的な質問ですみません。

You-KeyYou-Key2007/11/17 13:10すみません。解りました。KNOB2.0.0 を Download してknob-2.0.0.iso になった file をParallel を Double click して出てきたWindow からNew をselectして、さらにTypicalをselect, and Next, OS Type Linux, OS version, Other linux. そして、More Option で、iso file を指定すれば良いのでした。、、、 昨日も、Ruby on Rails の Bruce Tate さんにつまらない質問をして、FirstRule of Kayak: When in doubt, paddle like hell。と言う、email を頂いた所でした。

トラックバック - http://bioruby.g.hatena.ne.jp/nakao_mitsuteru/20071010

2007-05-21Ensembl API

Ensembl API for ruby (on ActiveRecord)

|  Ensembl API for ruby (on ActiveRecord) - "aac".translate #=> "N" を含むブックマーク はてなブックマーク -  Ensembl API for ruby (on ActiveRecord) - "aac".translate #=> "N"  Ensembl API for ruby (on ActiveRecord) - "aac".translate #=> "N" のブックマークコメント

Jan Aerts commited a Ensembl ruby API for the http://bioruby-annex.rubyforge.org.

screenshot

How to use script/example_emsembl.rb

  1. Provides a core db variable in a file (cf. coredb.rb).
$ENSEMBL_CORE_DATABASE = 'homo_sapiens_core_44_36f'
  1. Set a library path and required files.
bioruby-annex/ensembl-api% ruby -I lib -r coredb.rb -r lib/bio/api/enxembl script/example_ensembl.rb
--- !ruby/object:Bio::Api::Ensembl::Core::SeqRegion 
attributes:
  name: "1"
  coord_system_id: "17"
  length: "247249719"
  seq_region_id: "226034"
Number of simple features: 0
--- 
...
トラックバック - http://bioruby.g.hatena.ne.jp/nakao_mitsuteru/20070521

2007-05-03 *profiling_the_too_slow_genome_scale_embl_parsing*[EMBL] Profiling genome scale EMBL file parsi このエントリーを含むブックマーク このエントリーのブックマークコメント

トラックバック - http://bioruby.g.hatena.ne.jp/nakao_mitsuteru/20070503