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="")