C言語ケーススタディ 塩基配列の翻訳




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



 塩基配列を翻訳してアミノ酸配列を生成するプログラムを作成します。
対応表はNCBIのページ内では下記のように表記されています。
 Genetic Code [1]

 The Standard Code (transl_table=1)  

    AAs  = FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG
  Starts = ---M---------------M---------------M----------------------------
  Base1  = TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG
  Base2  = TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG
  Base3  = TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG

上の表記は、Base1がコドンの1文字目、Base2がコドンの2文字目、Base3がコドンの3文字目を表し対応するアミノ酸がAAsに記述されています。
たとえば、TTTの場合Base1、Base2、Base3がすべてTの場所(最初の文字)に相当するAAsの先頭の文字Fが対応するアミノ酸となります。 また、CTTならばBase1=C、Base2=T、Base3=Tの場所(17番目)に相当するAAsの文字Lが対応するアミノ酸となります。
今回は、上記の対応表をそのまま使い翻訳を行うプログラムを作成しました(trans_tbl変数にセット)。
翻訳する文字列は、seq変数にセットし、期待する結果のアミノ酸配列をtest変数にセットしました。 外側のループでseq変数の先頭から3文字ずつ取得しtrans_tblのBase1/2/3に一致するものを検索します(内側のループ)。 小文字の場合もあるのでseq内の文字は大文字に変換します。
#include <stdio.h>

char    *trans_tbl[4] = {
                "FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",
                "TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG",
                "TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG",
                "TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG"
        };

main()
{
        char    *test = "MWQLLLPTALLLLVSAGMRTEDLPKAVVFLEPQWYSVLEKDSVTLKCQGAYSPEDNSTQWFHSESLISSQASSYFIDAATVN";
        char    *seq = "atgtggcagctgctcctcccaactgctctgctacttctagtttcagctggc"
                       "atgcggactgaagatctcccaaaggctgtggtgttcctggagcctcaatgg"
                       "tacagcgtgcttgagaaggacagtgtgactctgaagtgccagggagcctac"
                       "tcccctgaggacaattccacacagtggtttcacagtgagagcctcatctca"
                       "agccaggcctcgagctacttcattgacgctgccacagtcaacg";
        int     i1;
        char    cno1, cno2, cno3;
        int     conv;

        for(;;){
                cno1 = *seq;
                cno2 = *(seq+1);
                cno3 = *(seq+2);
                if(cno1 == '\0' || cno2 == '\0' || cno3 == '\0')
                        break;

                if(cno1 >= 'a' && cno1 <= 'z'){
                        cno1 = cno1 - 'a' + 'A';
                }
                if(cno2 >= 'a' && cno2 <= 'z'){
                        cno2 = cno2 - 'a' + 'A';
                }
                if(cno3 >= 'a' && cno3 <= 'z'){
                        cno3 = cno3 - 'a' + 'A';
                }
                conv = '*';
                for(i1 = 0; i1 < 64; i1++){
                        if(trans_tbl[1][i1] == cno1 &&
                           trans_tbl[2][i1] == cno2 &&
                           trans_tbl[3][i1] == cno3){
                                conv = trans_tbl[0][i1];
                                break;
                        }
                }
                putchar(conv);
                seq += 3;
        }
        printf("\n%s\n", test);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
 このプログラムは、一文字を調べるためにループを使っています。 実用で使う場合には、trans_tblテーブルをもう少し工夫してループがないように変更したほうがよいでしょう(内側のfor文はなくすことができます)。


バイオインフォマティクス関連オリジナルツールなど
DNA塩基配列から相補配列を生成
アミノ酸配列表記の変換
相補配列の翻訳