User Tools

Site Tools


gcskewodysseyjapanese

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
gcskewodysseyjapanese [2007/10/22 23:24]
gaou
gcskewodysseyjapanese [2014/01/18 07:44] (current)
Line 14: Line 14:
 [[http://​www.g-language.org/​documentation/​1.7.1/​SubOpt.html#​SYNOPSIS|SubOpt API Manual]]、 ​ [[http://​www.g-language.org/​documentation/​1.7.1/​SubOpt.html#​SYNOPSIS|SubOpt API Manual]]、 ​
  
-[[ttp://​www.g-language.org/​documentation/​1.7.1/​G/​Messenger.html#​SYNOPSIS|Messenger API Manual]] ​+[[http://​www.g-language.org/​documentation/​1.7.2/​G/​Messenger.html#​SYNOPSIS|Messenger API Manual]] ​
  
 を参照していただく必要がありますが、ここでは要約して説明します。 を参照していただく必要がありますが、ここでは要約して説明します。
Line 23: Line 23:
 >​4、全ての出力はG::​Messenger APIを使う >​4、全ての出力はG::​Messenger APIを使う
 >​5、一つの関数は一つのサブルーチンから構成されるのが望ましい >​5、一つの関数は一つのサブルーチンから構成されるのが望ましい
->​6、グラフ作成には G::​Tools::​Graph::​_[[UniMultiGrapher|UniMultiGrapher]] ​を使用するのが望ましい+>​6、グラフ作成には G::​Tools::​Graph::​grapher ​を使用するのが望ましい
 >​7、出来る限り簡潔に、みやすく、汎用的に、美しいコーディングをするのが望ましい >​7、出来る限り簡潔に、みやすく、汎用的に、美しいコーディングをするのが望ましい
  
Line 32: Line 32:
  
  
-[[http://​www.g-language.org/​documentation/​1.7.1/​SubOpt.html#​SYNOPSIS|SubOpt]] API とは、Odyssey メソッドを使うときに -output=>;​show"​ のように ハイフンから始まって矢印でつなぐ、[[GetOpt|GetOpt]]に似たサブルーチン用オプションを可能にするAPIです。このAPIがG-language GAEの汎用性を高め、さらにシステム全体の統一性を実現しています。+[[http://​www.g-language.org/​documentation/​1.7.1/​SubOpt.html#​SYNOPSIS|SubOpt]] API とは、標準関数を使うときに -output=>;​show"​ のように ハイフンから始まって矢印でつなぐ、[[http://​perldoc.perl.org/​Getopt/​Std.html|GetOpt]]に似たサブルーチン用オプションを可能にするAPIです。このAPIがG-language GAEの汎用性を高め、さらにシステム全体の統一性を実現しています。
 [[http://​www.g-language.org/​documentation/​1.7.1/​SubOpt.html#​SYNOPSIS|SubOpt]]の仕様は非常に単純明解です。opt_default()でデフォルト値を決定し、opt_get() でオプションを取得。さらにopt_val()でオプションの値を参照できるようになっています。 [[http://​www.g-language.org/​documentation/​1.7.1/​SubOpt.html#​SYNOPSIS|SubOpt]]の仕様は非常に単純明解です。opt_default()でデフォルト値を決定し、opt_get() でオプションを取得。さらにopt_val()でオプションの値を参照できるようになっています。
  
 つまり、gcskew の関数ではウインドウがオプションですから、 &​gcskew($gb,​ -window=>"​1000"​);​ というように使えたらいいわけですが、これは つまり、gcskew の関数ではウインドウがオプションですから、 &​gcskew($gb,​ -window=>"​1000"​);​ というように使えたらいいわけですが、これは
  
 +<code perl>
   sub gcskew{ ​   sub gcskew{ ​
    my $gb = shift; ​    my $gb = shift; ​
    my $window = shift; ​    my $window = shift; ​
 +</​code>​
  
- +<code perl>
   sub gcskew{ ​   sub gcskew{ ​
     my @args = opt_get(@_); ​     my @args = opt_get(@_); ​
     my $gb = shift @args; ​     my $gb = shift @args; ​
     my $window = opt_val("​window"​); ​     my $window = opt_val("​window"​); ​
 +</​code>​
 +
 のように変えてやることで可能になります。 のように変えてやることで可能になります。
  
 まずopt_get()でオプションを取り出し、オプション以外の必要な引数を@argsにいれます。ここからGインスタンスをとりだし、opt_val("​window"​) で別にオプションの値を取り出します。オプションの値は最初に取り出しローカル変数に保存しておくと便利です。 まずopt_get()でオプションを取り出し、オプション以外の必要な引数を@argsにいれます。ここからGインスタンスをとりだし、opt_val("​window"​) で別にオプションの値を取り出します。オプションの値は最初に取り出しローカル変数に保存しておくと便利です。
  
-また、[[SubOpt|SubOpt]]にはGインスタンスに対して強力なメソッドが用意してあります。例えばこのGC skewの関数の場合、Gインスタンスで使用する部分は配列情報、つまり$gb->​{SEQ} のみです。すると、ゲノム全体ではなく一部の配列のGC skewを計算したければその部分の配列をそのままいれたり、もしくは大きな配列の場合はそのリファレンスを代入することでメモリ効率を良く保ちたい場合があると思います。こんな時には +また、SubOpt ​APIにはGインスタンスに対して強力なメソッドが用意してあります。例えばこのGC skewの関数の場合、Gインスタンスで使用する部分は配列情報、つまり$gb->​{SEQ} のみです。すると、ゲノム全体ではなく一部の配列のGC skewを計算したければその部分の配列をそのままいれたり、もしくは大きな配列の場合はそのリファレンスを代入することでメモリ効率を良く保ちたい場合があると思います。こんな時には
  
 +<code perl>
   sub gcskew{ ​   sub gcskew{ ​
     my @args = opt_get(@_); ​     my @args = opt_get(@_); ​
     my $gb = opt_as_gb(shift @args); ​     my $gb = opt_as_gb(shift @args); ​
     my $window = opt_val("​window"​); ​     my $window = opt_val("​window"​); ​
 +</​code>​
 +
 のように、opt_as_gb() 関数を使ってやると、それがGインスタンスでも、スカラー塩基配列でも、もしくはリファレンスでも自動的に$gb->​{SEQ} を使えばその配列情報にアクセスできるように変換してくれます。 のように、opt_as_gb() 関数を使ってやると、それがGインスタンスでも、スカラー塩基配列でも、もしくはリファレンスでも自動的に$gb->​{SEQ} を使えばその配列情報にアクセスできるように変換してくれます。
  
Line 65: Line 70:
 さて、上のままでは -window オプションが入力されないと、Window が 0になってしまいエラーになってしまいます。だからといって、毎回window オプションを入力しないといけないのでは汎用的だとはいえません。そこで、opt_default() を使って初期値を入力してやります。 さて、上のままでは -window オプションが入力されないと、Window が 0になってしまいエラーになってしまいます。だからといって、毎回window オプションを入力しないといけないのでは汎用的だとはいえません。そこで、opt_default() を使って初期値を入力してやります。
  
 +<code perl>
   sub gcskew{ ​   sub gcskew{ ​
     opt_default("​window"​=>​10000); ​     opt_default("​window"​=>​10000); ​
Line 70: Line 76:
     my $gb = opt_as_gb(shift @args); ​     my $gb = opt_as_gb(shift @args); ​
     my $window = opt_val("​window"​); ​     my $window = opt_val("​window"​); ​
 +</​code>​
 +
 こうしてやることで、windowオプションが入力されればその値が、入力されなければ 10000bp がウインドウサイズとして使用されます。 こうしてやることで、windowオプションが入力されればその値が、入力されなければ 10000bp がウインドウサイズとして使用されます。
  
 ====== Step3 オプションは "​output"​ と "​filename"​ を含むのが望ましい ====== ====== Step3 オプションは "​output"​ と "​filename"​ を含むのが望ましい ======
  
-前回作った gcskew はファイルとグラフの二つの出力がありました。G-language GAE では容易に使えることに重点をおいていますので、Odyssey ​関数には標準で全て output というオプションがついていて、"​f"​ の値で'​data'​フォルダ内にファイル出力、"​g"​の値で'​graph'​フォルダ内にグラフ出力、指定なし、もしくは"​show"​ の値でグラフを自動的に表示する、という機能を持つ必要があります。また、この時任意に出力するファイルの名前を指定できる必要があります。これにあわせて少しプログラム全体を変えてみましょう。outputの値次第で出力先を変える処理を加えてみます。+前回作った gcskew はファイルとグラフの二つの出力がありました。G-language GAE では容易に使えることに重点をおいていますので、標準関数関数には標準で全て output というオプションがついていて、"​f"​ の値で'​data'​フォルダ内にファイル出力、"​g"​の値で'​graph'​フォルダ内にグラフ出力、指定なし、もしくは"​show"​ の値でグラフを自動的に表示する、という機能を持つ必要があります。また、この時任意に出力するファイルの名前を指定できる必要があります。これにあわせて少しプログラム全体を変えてみましょう。outputの値次第で出力先を変える処理を加えてみます。
 具体的には、opt_defaultの追加、opt_valをローカル変数に代入、そしてファイル名を$filenameに置き換え、出力先による設定を変えます。 具体的には、opt_defaultの追加、opt_valをローカル変数に代入、そしてファイル名を$filenameに置き換え、出力先による設定を変えます。
  
 +<code perl>
   sub gcskew{ ​   sub gcskew{ ​
      ​opt_default("​window"​=>​10000,​ "​output"​=>"​show",​ "​filename"​=>"​gcskew.png"​); ​      ​opt_default("​window"​=>​10000,​ "​output"​=>"​show",​ "​filename"​=>"​gcskew.png"​); ​
Line 109: Line 118:
      ​}elsif ($output eq '​g'​ || $output eq '​show'​){ ​      ​}elsif ($output eq '​g'​ || $output eq '​show'​){ ​
            mkdir ('​graph',​ 0777); ​            mkdir ('​graph',​ 0777); ​
-           ​G::​Tools::​Graph::​_UniMultiGrapher(¥@location,​ ¥@gcskew, -x=>'​bp', ​+           ​G::​Tools::​Graph::​grapher(¥@location,​ ¥@gcskew, -x=>'​bp', ​
                                            ​-y=>'​GC skew', -title=>'​GC skew', ​       ​                                            ​-y=>'​GC skew', -title=>'​GC skew', ​       ​
                                            ​-filename=>'​graph/​gcskew.png'​); ​                                            ​-filename=>'​graph/​gcskew.png'​); ​
Line 118: Line 127:
      ​return @gcskew; ​      ​return @gcskew; ​
   }    } 
 +</​code>​
  
 ====== Step 4. 全ての出力はG::​Messenger APIを使う ====== ====== Step 4. 全ての出力はG::​Messenger APIを使う ======
  
  
-だいぶここまででもOdysseyメソッドらしくなってきましたが、もう一つ重要な決まりがあります。それは、全ての出力をG::​Messenger APIを介してやらなければならない、ということです。G-language GAEは多彩なインタフェースを持ちます。プログラム言語としてコンパイラに読ませたり、コマンドラインで実行したり、グラフィカルユーザインタフェースを持ったり、さらにはウェブアプリケーションとしてさえ存在します。しかし、多彩なインタフェースでは全て同じOdysseyのプログラムが動いています。これを可能にするのがG::​Messenger APIです。OdysseyメソッドがMessengerに出力を渡すと、MessengerはG-language GAEが現在どのインタフェースを使って動いているかを判断し、的確な場所に出力を渡します。+だいぶここまででも標準関数らしくなってきましたが、もう一つ重要な決まりがあります。それは、全ての出力をG::​Messenger APIを介してやらなければならない、ということです。G-language GAEは多彩なインタフェースを持ちます。プログラム言語としてコンパイラに読ませたり、コマンドラインで実行したり、グラフィカルユーザインタフェースを持ったり、さらにはウェブアプリケーションとしてさえ存在します。しかし、多彩なインタフェースでは全て同じ標準関数のプログラムが動いています。これを可能にするのがG::​Messenger APIです。メソッドがMessengerに出力を渡すと、MessengerはG-language GAEが現在どのインタフェースを使って動いているかを判断し、的確な場所に出力を渡します。
 Messenger で主に使われる関数は次の通りです。 Messenger で主に使われる関数は次の通りです。
  
Line 128: Line 138:
 msg_error() --- print STDERR と同義 エラーやシステムメッセージのアウトプットに。 msg_error() --- print STDERR と同義 エラーやシステムメッセージのアウトプットに。
 msg_gimv() --- system("​gimv "); と同義 グラフの表示に。 msg_gimv() --- system("​gimv "); と同義 グラフの表示に。
-これでgcskew のOdyssey ​化が完了です。+これでgcskew の標準関数化が完了です。
  
 +<code perl>
   sub gcskew{ ​   sub gcskew{ ​
      ​opt_default("​window"​=>​10000,​ "​output"​=>"​show",​ "​filename"​=>"​gcskew.png"​); ​      ​opt_default("​window"​=>​10000,​ "​output"​=>"​show",​ "​filename"​=>"​gcskew.png"​); ​
Line 163: Line 174:
      ​}elsif ($output eq '​g'​ || $output eq '​show'​){ ​      ​}elsif ($output eq '​g'​ || $output eq '​show'​){ ​
            mkdir ('​graph',​ 0777); ​            mkdir ('​graph',​ 0777); ​
-           ​G::​Tools::​Graph::​_UniMultiGrapher(¥@location,​ ¥@gcskew, -x=>'​bp',​ -y=>'​GC skew', -title=>'​GC skew', ​       ​+           ​G::​Tools::​Graph::​grapher(¥@location,​ ¥@gcskew, -x=>'​bp', ​ 
 +                                              ​-y=>'​GC skew', -title=>'​GC skew', ​       ​
                                              ​-filename=>'​gcskew.png'​); ​                                              ​-filename=>'​gcskew.png'​); ​
         ​         ​
Line 171: Line 183:
      ​return @gcskew; ​      ​return @gcskew; ​
   }    } 
 +</​code>​
  
  
Line 176: Line 189:
  
  
-今回GC skew関数のOdyssey化を説明しましたが、実際にG-language GAEに実装されているgcskew() 関数は AT skewもみれるようになっていたりと、汎用性やコードの簡潔さでより徹底した改良がされています。一度ソースコードをみて勉強してみてください。また、マニュアルにはより詳しいOdyssey化の仕様について記載されていますので、こちらもじっくりと読んでみてください。 +今回GC skew関数の標準関数化を説明しましたが、実際にG-language GAEに実装されているgcskew() 関数は AT skewもみれるようになっていたりと、汎用性やコードの簡潔さでより徹底した改良がされています。一度ソースコードをみて勉強してみてください。また、マニュアルにはより詳しい標準関数化の仕様について記載されていますので、こちらもじっくりと読んでみてください。 
-今後自分で作った解析メソッドをOdyssey化し、G-language GAEに実装する機会が来ると思います。作ったOdysseyメソッドは、mt-post@g-language.org に、サブジェクトが関数名、本文がソースコード、という形でメールすることで投稿できます。バイオインフォマティックスの未来の為にあなたが貢献する日は明日かもしれませんね。+今後自分で作った解析メソッドを標準関数化し、G-language GAEに実装する機会が来ると思います。作った標準関数メソッドは、glang-devel@lists.sourceforge.jp に、サブジェクトが関数名、本文がソースコード、という形でメールすることで投稿できます。バイオインフォマティックスの未来の為にあなたが貢献する日は明日かもしれませんね。
gcskewodysseyjapanese.1193095449.txt.gz · Last modified: 2014/01/18 07:44 (external edit)