home about terms twitter

Pyteomicsを用いたペプチドのモノアイソトピック質量の計算

date: 2020-02-12 | mod: 2020-02-12

PythonのライブラリであるPyteomics(公式サイト)を用いて、FASTAファイル中のペプチド配列からモノアイソトピック質量を計算します。

  • Pyteomics …プロテオミクスに特化したPythonのライブラリ
  • モノアイソトピック質量 …(monoisotopic mass、exact mass)構成原子のうち、最も多い同位体から構成された分子の質量であり、m/zとして質量分析の時に値を利用する場合がある。

なお、同様のライブラリにはOpenMSが配布しているPyOpenMS(公式サイト)がありますが、今回は個人的に作業に慣れているWindows10とAnacondaの組み合わせで実施するために、Pyteomicsを採用しました。
(2020/02/13 追記:PyOpenMSを用いたものをつくりました。->こちら

index


コード全体

動作環境:

  • python 3.6.8
  • pyteomics 4.2-py_0
  • windows10 64bit anaconda
input output
input.fasta output_mass(listオブジェクト)
from pyteomics import mass, parser

f = open('input.fasta', 'r')
lines = f.readlines()

pep_list = []
pep = ''
for num in range(len(lines)):
    line = lines[num]
    if line.find('>') == 0:
        if pep == '':
            pass
        else:
            pep_list.append(pep)
            pep = ''
    elif line.find('>') != 0 and line != '\n':
        pep += line.replace('\n', '')
    if num + 1 == len(lines):
        pep_list.append(pep)

output_mass = []

for pep in pep_list:
    ps = parser.parse(pep, show_unmodified_termini=True)
    pep_mass = mass.calculate_mass(parsed_sequence=ps)
    output_mass.append(pep_mass)

print(output_mass)

f.close

入力

今回の入力ファイルである"input.fasta"は以下の通りです。以下の3つの配列から構成されます。

>test_1
PEPTIDE

>test_2
DNA

>test_3
RNA
SEQUENCE
MSMS

FASTAファイルは80字程度で改行されている場合があるため、確認のためにtest_3配列には意図的に改行を加えています。


ペプチドリストの作成

pep_list = []
pep = ''
for num in range(len(lines)):
    line = lines[num]
    if line.find('>') == 0:
        if pep == '':
            pass
        else:
            pep_list.append(pep)
            pep = ''
    elif line.find('>') != 0 and line != '\n':
        pep += line.replace('\n', '')
    if num + 1 == len(lines):
        pep_list.append(pep)

入力に用いるペプチドを、取り扱いやすいようにlistオブジェクトに追加していきます。最初に空のリストとして「pep_list」を作成しておきます。また、空の(正確にはstrオブジェクトで文字が入力されていない)「pep」を宣言します。

forループの中では、「Pythonを用いたFASTA配列中の最初の塩基の削除」でおこなったものと同様の作業を行います。FASTAファイル中のヘッダー(配列の名前や学名などの情報を入れる箇所)にある">“を判断するif条件文を用いています。

このコード中では、linesにある行の文字列を直接ループせず、range(len(lines))とすることで、行番号(num)をループしています。ある行の文字列を取得するときは、

line = lines[num]

のように指定します。

if line.find('>') == 0:
    if pep == '':
        pass
    else:
        pep_list.append(pep)
        pep = ''

この箇所では、ヘッダー部分に達したときの条件分岐を記載しています。pep = ‘'、すなわちファイルの最も初めの行の時にはpassします。その他の時(二番目以降のヘッダーに達したとき)には、それまでにpepに格納された配列(後述)をpep_listに追加して、pepを配列情報の無い状態に戻します。

elif line.find('>') != 0 and line != '\n':
    pep += line.replace('\n', '')
if num + 1 == len(lines):
    pep_list.append(pep)

elifでは、「ヘッダーではなく、かつ改行のみでない」場合に以下の処理を行うようにしています。FASTAファイルによっては、input.fastaのように次の配列のヘッダーへ行く前に改行がなされている場合があるため、それを除外します。
elif以下では、pep変数に現在の行を追加します。ただし、このコード中では改行が”\n"として読み込まれているため、それをreplaceで除いています。

最後に、行の最後に達した(最後の配列まで取得した)場合にpep_listにpepを追加します。len(lines)で全行数を数えると「8」になりますが、numは0~7の8個をとるため、数を合わせるためにnum+1しています。

質量の計算

モノアイソトピック質量の計算には、Pyteomicsのmass.calculate_mass()を用います。

for pep in pep_list:
    ps = parser.parse(pep, show_unmodified_termini=True)
    pep_mass = mass.calculate_mass(parsed_sequence=ps)
    output_mass.append(pep_mass)

parser.parse()では、ペプチド配列をアミノ酸残基のリストに変換します。第一引数に変換するペプチド配列(ここではpep)を指定し、show_unmodified_termini=Trueを指定することで、ペプチドNおよびC末端のHおよびOHが計算に取り入れられます。

mass.calculate_mass()では、実際に質量計算を行います。parsed_sequenceで、アミノ酸残基のリストに変換したペプチド(ps)を指定します。

そして、最後にoutput_mass.append(pep_mass)で出力リスト(output_mass)に各値を追加します。


出力

このコードを実行することで、以下の出力が得られます。

[799.35996402671, 318.11754893338, 1765.5608760516898]

各ペプチドの質量が得られたことが確認されました。