C言語ケーススタディ 相補配列の翻訳




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



 今回は塩基配列のそうほ配列を翻訳してアミノ酸配列を生成するプログラムを作成します。
DNA塩基配列から相補配列を生成」と「アミノ酸配列表記の変換」を合成すればよいだけですが、両者ともサブルーチン(関数)の形になっていないのでそのまま合成するのは難しいと思います。 まずは、相補配列を取得するサブルーチンを作成します。
#include <stdio.h>

char    *get_complement(char *str);

main()
{
        char    *str;

        str = "acgtaaccggttatgctata";
        printf("%s\n", str);
        printf("%s\n", get_complement(str));
}


char    *get_complement(char *str)
{
        static char
                result[100];
        char    ch;
        int     i, j, len;

        len = strlen(str);
        j = 0;
        for (i = 0; ; i++) {
                if(*(str+i) == '\0')
                        break;
                ch = *(str+(len-i-1));
                switch(ch){
                case 'a': ch = 't'; break;
                case 'A': ch = 'T'; break;
                case 'g': ch = 'c'; break;
                case 'G': ch = 'C'; break;
                case 'c': ch = 'g'; break;
                case 'C': ch = 'G'; break;
                case 't': ch = 'a'; break;
                case 'T': ch = 'A'; break;
                }
                result[j++] = ch;
        }
        result[j] = '\0';
        return(result);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
 このプログラムは、相補配列の結果をresultという固定サイズの配列にセットしています。 実用で使う場合には、malloc()関数などで必要なサイズの領域を確保するように変更したほうがよいでしょう。
 相補配列の取得結果をアミノ酸配列に変換するように変更したのが次のプログラムです。
#include <stdio.h>

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


char    *get_complement(char *str);

main()
{
        char    *str, *seq;
        int     i1;
        char    cno1, cno2, cno3;
        int     conv;

        str = "acgtaaccggttatgctata";
        printf("%s\n", str);
        seq = get_complement(str);

        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;
        }
}


char    *get_complement(char *str)
{
        static char
                result[100];
        char    ch;
        int     i, j, len;

        len = strlen(str);
        j = 0;
        for (i = 0; ; i++) {
                if(*(str+i) == '\0')
                        break;
                ch = *(str+(len-i-1));
                switch(ch){
                case 'a': ch = 't'; break;
                case 'A': ch = 'T'; break;
                case 'g': ch = 'c'; break;
                case 'G': ch = 'C'; break;
                case 'c': ch = 'g'; break;
                case 'C': ch = 'G'; break;
                case 't': ch = 'a'; break;
                case 'T': ch = 'A'; break;
                }
                result[j++] = ch;
        }
        result[j] = '\0';
        return(result);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
実用で使う場合には、アミノ酸配列への変更もサブルーチン化したほうがよいと思います。


バイオインフォマティクス関連オリジナルツールなど
DNA塩基配列から相補配列を生成
アミノ酸配列表記の変換
塩基配列の翻訳
おすすめのバイオインフォマティクス関連の書籍です。参考にしてください。

初心者でもわかる!バイオインフォマティクス入門 [ 坊農秀雅 ]

価格:3,990円
(2013/1/27 10:50時点)
感想(0件)

バイオインフォマティクスin silico [ 松山泰男 ]

価格:3,675円
(2013/1/27 10:51時点)
感想(0件)

[an error occurred while processing this directive]