import string
# 一文字記号から三文字記号への変換表
residue_name = {'a': 'ala', 'r': 'arg', 'n': 'asn', 'd': 'asp', 'c': 'cys',
'q': 'gln', 'e': 'glu', 'g': 'gly', 'h': 'his', 'i': 'ile',
'l': 'leu', 'k': 'lys', 'm': 'met', 'f': 'phe', 'p': 'pro',
's': 'ser', 't': 'thr', 'w': 'trp', 'y': 'tyr', 'v': 'val'}
# アミノ酸残基の質量表
residue_mass = {'ala': 71.0790184654,
'arg': 157.196106437,
'asn': 114.104059219,
'asp': 114.080688839,
'cys': 103.143406585,
'gln': 128.131048075,
'glu': 128.107677695,
'gly': 57.0520296093,
'his': 137.141527428,
'ile': 113.159985034,
'leu': 113.159985034,
'lys': 129.182660137,
'met': 131.197384297,
'phe': 147.17714379,
'pro': 97.1170442246,
'ser': 87.0783231891,
'thr': 101.105312045,
'trp': 186.213916723,
'tyr': 163.176448514,
'val': 99.1329961777}
# ペプチド鎖末端の質量
terminus_mass = 18.0152566767
# 計算を実行する関数
def totalMass(peptide_chain):
mass = terminus_mass
for residue in peptide_chain:
residue = string.lower(residue)
if len(residue) == 1:
residue = residue_name[residue]
mass = mass + residue_mass[residue]
return mass
アミノ酸残基の情報を格納するのに辞書を二つ使っていることに注意しましょう。
次に、このモジュールを使った簡単な応用を示します:
from PeptideChain import totalMass
print totalMass('AEG')
print totalMass(['ala', 'arg', 'gly', 'his'])
from Scientific.IO.TextFile import TextFile
import string
import Numeric
def readMatrix(filename):
rows = []
for line in TextFile(filename):
columns = []
for number in string.split(line):
columns.append(string.atof(number))
rows.append(columns)
return Numeric.array(rows)
def writeMatrix(a, filename):
file = TextFile(filename, 'w')
for line in a:
for number in line:
file.write(`number` + ' ')
file.write('\n')
file.close()
一番目の関数では、リストの全要素に string.atof 関数を適用しています。 これは頻繁に用いる操作なので、特別な短縮法が導入されています:map(function, sequence) 関数は、列の各要素に関数を適用して、結果のリストを返します。 これにより、
columns = []
for number in string.split(line):
columns.append(string.atof(number))
という複数行を、columns = map(string.atof,
string.split(line)) の一行で置き換えることができます。
まず、テスト用データを生成します:
import MatrixIO
import Numeric
for i in range(1, 51):
time = Numeric.arrayrange(10.)
values = 4.*Numeric.ones(10)
parameters = (i, -3.5)
data = Numeric.zeros((11, 2), Numeric.Float)
data[0] = parameters
data[1:, 0] = time
data[1:, 1] = values
MatrixIO.writeMatrix(data, "data"+`i`)
出力の前に、全てを一つの大きな配列に代入するやり方に注意して下さい;
これによって、前の練習問題で書いた行列の出力関数が使えます。
解析プログラムの結果は、定数の時系列で、その値は 1 から 50 までの整数の和の二倍、すなわち 50*51=2550 になるはずです。
そして、データファイルを "解析" するプログラムです。
import MatrixIO
import Numeric
import Gnuplot
total = 0.
for i in range(1, 51):
data = MatrixIO.readMatrix("data"+`i`)
time = data[1:, 0]
values = data[1:, 1]
parameters = data[0]
total = total + parameters[0]*Numeric.sqrt(values)
plot_data = Numeric.transpose(Numeric.array([time, total]))
Gnuplot.plot(plot_data)