User Tools

Site Tools


gcskewodysseyenglish

This is an old revision of the document!


Introduction

Sets of subroutines that users made are easily mounted into G-language GAE as standard functions. Same types of analytic tools hold up the development of bioinformatics. So combining sets of subroutines into G-language GAE as an original package is one idea for using it. In this tutorial, we will demonstrate how to combine previously made GC skew subroutines into G-language GAE as standard functions.

STEP 0 - Learn the rules for standard functions

There are several rules for standard functions since it is literally standard for Perl script. These rules are not for regulation purpose but for expanding the usability.

See following documents for detail.

Standard Function Manual

SubOpt API Manual

Messenger API Manual

The essence is as follow:

1: Use SubOpt API to run options
2: All options should possess initial value to abbreviate options for single argument G instance
3: All options should contain “output” and “filename”
4: Use G::Messenger API to run all the outputs
5: One function should consisted of one subroutine
6: Graphs should generated by G::Tools::Graph::grapher
7: All coding should be simple, readable, resourceful, and beautiful

In this tutorial we will skip demonstrating essence #5, 6, and 7.

STEP 1 – Use SubOpt API to run options

SubOpt is specialized for acquiring options in subroutine which is similar to GetOpt API in syntax where it begins in hyphen and ends in a double or single quotation such as –output⇒”show”. This API enhances the resourcefulness of G-language GAE and provoking unity for whole system. Use of SubOpt API is simple. Set a initial value in opt_default(), then fetch the options by opt_get(). In addition, options are referable by opt_val().

In the case of GC skew subroutine, window size is given as option so that scripting as &gcskew($gb, -window⇒"1000"); makes us happy. To achive this, change following script

  sub gcskew { 
    my $gb = shift; 
    my $window = shift;
  } 

to following.

  sub gcskew { 
    my @args = opt_get(@_); 
    my $gb = shift @args; 
    my $window = opt_val("window"); 
  }

Fetching a option by opt_get() and substitute arguments into array @argv other than options. Then extract G instance from the array and also extract options doing opt_val(“window”). It would be nice to substitute a value of option to local variable.

There are some powerful methods ready for SubOpt API. In the case of GC skew subroutine, $gb→{SEQ} is the only required method in G instance. So if users want to analyze partial information on genome or reference much larger sequences to save up some RAM space, it is easily described as follow.

  sub gcskew { 
    my @args = opt_get(@_); 
    my $gb = opt_as_gb(shift @args); 
    my $window = opt_val("window"); 
  }

A function opt_as_gb() will translate $gb→{SEQ} as target sequence whether it is scholar or reference.

Step2 オプションはデフォルト値を持たせ省略できるようにし、G のインスタンスの入力のみで使えるようにする

さて、上のままでは -window オプションが入力されないと、Window が 0になってしまいエラーになってしまいます。だからといって、毎回window オプションを入力しないといけないのでは汎用的だとはいえません。そこで、opt_default() を使って初期値を入力してやります。

  sub gcskew{ 
    opt_default("window"=>10000); 
    my @args = opt_get(@_); 
    my $gb = opt_as_gb(shift @args); 
    my $window = opt_val("window"); 

こうしてやることで、windowオプションが入力されればその値が、入力されなければ 10000bp がウインドウサイズとして使用されます。

Step3 オプションは "output" と "filename" を含むのが望ましい

前回作った gcskew はファイルとグラフの二つの出力がありました。G-language GAE では容易に使えることに重点をおいていますので、標準関数関数には標準で全て output というオプションがついていて、"f" の値で'data'フォルダ内にファイル出力、"g"の値で'graph'フォルダ内にグラフ出力、指定なし、もしくは"show" の値でグラフを自動的に表示する、という機能を持つ必要があります。また、この時任意に出力するファイルの名前を指定できる必要があります。これにあわせて少しプログラム全体を変えてみましょう。outputの値次第で出力先を変える処理を加えてみます。 具体的には、opt_defaultの追加、opt_valをローカル変数に代入、そしてファイル名を$filenameに置き換え、出力先による設定を変えます。

  sub gcskew{ 
     opt_default("window"=>10000, "output"=>"show", "filename"=>"gcskew.png"); 
     my @args = opt_get(@_); 
     my $gb = opt_as_gb(shift @args); 
     my $window = opt_val("window"); 
     my $output = opt_val("output"); 
     my $filename = opt_val("filename");  
     my @gcskew = (); 
     my @location = ();  
 
     my $i = 0;   
     for ($i = 0; $i * $window < length($gb->{SEQ}); $i ++){      
           my $sequence = substr($gb->{SEQ}, $i * $window, $window);   
           my $c = $sequence =~ tr/c/c/;  
           my $g = $sequence =~ tr/g/g/;   
           my $skew = ($c-$g)/($c+$g);    
           push (@location, $i * $window);  
           push (@gcskew, $skew);      
     } 
 
     if ($output eq 'f'){ 
           mkdir ('data', 0777); 
           $filename =~ s/¥.png$/¥.csv$/; 
           my $j = 0; 
           open(OUT, '>data/' . $filename); 
           print OUT "location,GC skew¥n"; 
           for ($j = 0; $j <= $i; $j++){ 
                print OUT $location[$j], ",", $gcskew[$j], "¥n"; 
           } 
           close(OUT); 
     }elsif ($output eq 'g' || $output eq 'show'){ 
           mkdir ('graph', 0777); 
           G::Tools::Graph::grapher(¥@location, ¥@gcskew, -x=>'bp', 
                                           -y=>'GC skew', -title=>'GC skew',        
                                           -filename=>'graph/gcskew.png'); 
 
           system("gimv graph/gcskew.png"); 
     } 
 
     return @gcskew; 
  } 

Step 4. 全ての出力はG::Messenger APIを使う

だいぶここまででも標準関数らしくなってきましたが、もう一つ重要な決まりがあります。それは、全ての出力をG::Messenger APIを介してやらなければならない、ということです。G-language GAEは多彩なインタフェースを持ちます。プログラム言語としてコンパイラに読ませたり、コマンドラインで実行したり、グラフィカルユーザインタフェースを持ったり、さらにはウェブアプリケーションとしてさえ存在します。しかし、多彩なインタフェースでは全て同じ標準関数のプログラムが動いています。これを可能にするのがG::Messenger APIです。メソッドがMessengerに出力を渡すと、MessengerはG-language GAEが現在どのインタフェースを使って動いているかを判断し、的確な場所に出力を渡します。 Messenger で主に使われる関数は次の通りです。

msg_send() — print STDOUT と同義 通常のアウトプットに。 msg_error() — print STDERR と同義 エラーやシステムメッセージのアウトプットに。 msg_gimv() — system("gimv "); と同義 グラフの表示に。 これでgcskew の標準関数化が完了です。

  sub gcskew{ 
     opt_default("window"=>10000, "output"=>"show", "filename"=>"gcskew.png"); 
     my @args = opt_get(@_); 
     my $gb = opt_as_gb(shift @args); 
     my $window = opt_val("window"); 
     my $output = opt_val("output"); 
     my $filename = opt_val("filename"); 
 
     my @gcskew = (); 
     my @location = ();  
 
     my $i = 0;   
     for ($i = 0; $i * $window < length($gb->{SEQ}); $i ++){      
           my $sequence = substr($gb->{SEQ}, $i * $window, $window);   
           my $c = $sequence =~ tr/c/c/;  
           my $g = $sequence =~ tr/g/g/;   
           my $skew = ($c-$g)/($c+$g);    
           push (@location, $i * $window);  
           push (@gcskew, $skew);      
     } 
 
     if ($output eq 'f'){ 
           mkdir ('data', 0777); 
           $filename =~ s/¥.png$/¥.csv$/; 
           my $j = 0; 
           open(OUT, '>data/' . $filename); 
           print OUT "location,GC skew¥n"; 
           for ($j = 0; $j <= $i; $j++){ 
                print OUT $location[$j], ",", $gcskew[$j], "¥n"; 
           } 
           close(OUT); 
     }elsif ($output eq 'g' || $output eq 'show'){ 
           mkdir ('graph', 0777); 
           G::Tools::Graph::grapher(¥@location, ¥@gcskew, -x=>'bp', 
                                              -y=>'GC skew', -title=>'GC skew',        
                                             -filename=>'gcskew.png'); 
 
           msg_gimv("graph/gcskew.png"); 
     } 
 
     return @gcskew; 
  } 

Step 5. To the next level ...

今回GC skew関数の標準関数化を説明しましたが、実際にG-language GAEに実装されているgcskew() 関数は AT skewもみれるようになっていたりと、汎用性やコードの簡潔さでより徹底した改良がされています。一度ソースコードをみて勉強してみてください。また、マニュアルにはより詳しい標準関数化の仕様について記載されていますので、こちらもじっくりと読んでみてください。 今後自分で作った解析メソッドを標準関数化し、G-language GAEに実装する機会が来ると思います。作った標準関数メソッドは、glang-devel@lists.sourceforge.jp に、サブジェクトが関数名、本文がソースコード、という形でメールすることで投稿できます。バイオインフォマティックスの未来の為にあなたが貢献する日は明日かもしれませんね。

gcskewodysseyenglish.1285936332.txt.gz · Last modified: 2014/01/18 07:44 (external edit)