Pythonプログラミング(総合演習課題)
このページでは、DNAの塩基配列データをCのプログラムで扱うための「支援プログラム」について、使い方や仕様を説明する。
「支援プログラム」の仕様
データの表現
ヌクレオチドの塩基は、記号としてではなく、数値で表現するようプログラムされている。その対応は
塩基 | 対応する数値 | 記号 |
T (またはU) | 1 | ga.NUC_T |
C | 2 | ga.NUC_C |
A | 3 | ga.NUC_A |
G | 4 | ga.NUC_G |
ga.NUC_T
は、そこに1と書くのと同じである。他の塩基についても同様。(3.141592...と書くかわりにmath.pi
と書
くことができたのと同じ原理)。
アミノ酸も同様に、数値として扱うようプログラムされている。対応する数値は、ga.pyを見れば一目瞭然なので、ここでは省略する。
GenBank形式のデータの読み出し
import ga ... data = ga.readGBK("データファイル名")
ga.readGBK関数を実行すると、データがリストで返される。
塩基の系列は、リスト(data)の先頭から、T,C,A,Gに対応した数値(1,2,3,4)に変換され、順に格納されている。
先頭の塩基は data[0]、末尾のデータは data[n-1]ということになる。
塩基対の数はリストの要素数として len(data)
で得られる。
この関数を実行すると、読み込みファイル名と、読み込まれた塩基対の数が、画面に出力される。
塩基配列の画面への出力
ga.printNuc(データを入れたリスト)
塩基を表す数値の並びを、T,A,C,Gの記号の列として、画面にプリントする。
data=[ ga.NUC_A, ga.NUC_C, ga.NUC_G, ga.NUC_T, ga.NUC_A, ga.NUC_C ] printNuc(data) ;
上記のプログラム(の部分)を実行すると、画面には
ACGTAC
と表示される。なお、配列の末尾では改行される。
塩基のトリプレットからアミノ酸コードへの変換
a = ga.aminoAcid(n1,n2,n3)
タンパクをコードする3つの塩基(トリプレット)とアミノ酸の対応関係を求めるための関数。 塩基を表す数値を三つ与えると(n1,n2,n3)、それに対応するアミノ酸を表すコード(数値)を返す。 プログラム中では、20種類のアミノ酸に対応づけて、1から20までの整数を割り当てている。 ただし、アミノ酸をコードしていない組(TGA,TAA,TAG:終了コード)には -1 を割り当てている。
塩基のトリプレット対応するアミノ酸の記号をプリント
ga.printAminoAcid(n1,n2,n3) ;
塩基を表す数値を三つ与えると(n1,n2,n3)、それに対応するアミノ酸を表す記号(1文字)をプリントする。
例えば、printAminoAcid(1,1,1)
は、”F"をプリント。
文字をプリントした後、改行はされない。
塩基のトリプレットの塩基配列をプリント
ga.printTriplet(n1,n2,n3)
塩基を表す数値を三つ与えると(n1,n2,n3)、それに対応する塩基を表す記号(3文字)をプリントする。
例えば、printTriplet(1,1,1)
は、”TTT"をプリント。
文字をプリントした後、改行はされない。
プログラムリスト(ga.py)
# Written for Joho Kiso A # Yoshinori Hayakawa, 2011 # 2019-02-22: Python version import math # defs for nucleotide NUC_T=1 NUC_U=1 NUC_C=2 NUC_A=3 NUC_G= 4 # defs for amino acid */ AA_A=1 AA_C=2 AA_D=3 AA_E=4 AA_F=5 AA_G=6 AA_H=7 AA_I=8 AA_K=9 AA_L=10 AA_M=11 AA_N=12 AA_P=13 AA_Q=14 AA_R=15 AA_S=16 AA_T=17 AA_V=18 AA_W=19 AA_Y=20 AA_X=(-1) # terminate code def readGBK(filename): fp = open(filename,"r") ; if fp is None: print("cannot open file:",filename) return 0 print("reading:",filename) n=0 nucdata=[ ] started=False for line in fp: records = line.split() if records[0]=="ORIGIN": started = True n=0 elif records[0]=="//": started = False else: if started: for i in range(len(line)): c = str(line)[i] # print(c) if c=='a' or c=='A': nucdata.append(NUC_A) n=n+1 elif c=='u' or c=='U' or c=='t' or c=='T': nucdata.append(NUC_T) n=n+1 elif c=='c' or c=='C': nucdata.append(NUC_C) n=n+1 elif c=='g' or c=='G': nucdata.append(NUC_G) n=n+1 fp.close print(n,"bp") return nucdata def aminoAcid(x, y, z): tab=[ AA_F, AA_F, AA_L, AA_L, AA_S, AA_S, AA_S, AA_S, AA_Y, AA_Y, AA_X, AA_X, AA_C, AA_C, AA_X, AA_W, AA_L, AA_L, AA_L, AA_L, AA_P, AA_P, AA_P, AA_P, AA_H, AA_H, AA_Q, AA_Q, AA_R, AA_R, AA_R, AA_R, AA_I, AA_I, AA_I, AA_M, AA_T, AA_T, AA_T, AA_T, AA_N, AA_N, AA_K, AA_K, AA_S, AA_S, AA_R, AA_R, AA_V, AA_V, AA_V, AA_V, AA_A, AA_A, AA_A, AA_A, AA_D, AA_D, AA_E, AA_E, AA_G, AA_G, AA_G, AA_G] k = (x-1)*16 + (y-1)*4 + (z-1) if k>=0 and k<64: return tab[k] else: return 0 def printAminoAcid(x, y, z): k = aminoAcid(x,y,z) dic={ AA_A: 'A', AA_C: 'C', AA_D: 'D', AA_E: 'E', AA_F: 'F', AA_G: 'G', AA_H: 'H', AA_I: 'I', AA_K: 'K', AA_L: 'L', AA_M: 'M', AA_N: 'N', AA_P: 'P', AA_Q: 'Q', AA_R: 'R', AA_S: 'S', AA_T: 'T', AA_V: 'V', AA_W: 'W', AA_Y: 'Y', AA_X: 'x', } if k in dic.keys(): print(dic[k],sep="",end="") else: print('?',sep="",end="") def printNuc(nucdata): for c in nucdata: if c==NUC_A: print("A",sep="",end="") elif c==NUC_T: print("T",sep="",end="") elif c==NUC_C: print("C",sep="",end="") elif c==NUC_G: print("G",sep="",end="") print("") def printTriplet(x, y, z): trip=[x,y,z] for c in trip: if c==NUC_A: print("A",sep="",end="") elif c==NUC_T: print("T",sep="",end="") elif c==NUC_C: print("C",sep="",end="") elif c==NUC_G: print("G",sep="",end="")