PDBをFASTAに変換する

PDB のファイルはタンパク質の構造情報やそのアミノ酸配列が書かれている。次の例は、PDB のファイルからアミノ酸配列の情報だけを抽出し、FASTA 形式で出力する処理である。

アミノ酸情報は PDB ファイルの中で、SEQRES レコードと ATOM レコードに保存されている。SEQRES レコードにはタンパク質を構成するすべてのアミノ酸が記載されている。これに対し、ATOM レコードには、立体構造(空間座標)のわかっているアミノ酸だけが記載されている。従って、両者を比べると、しばしば ATOM レコードに記載されるアミノ酸の数が少ない。

次の例では、ATOM レコードからアミノ酸を取得する。タンパク質を構成する全アミノ酸を取得できないが、立体情報を持つアミノ酸のみを取得できるため、ホモロジーモデリングソフトウェア MODELLER の入力ファイルなどを作成するときに役立つ。

use strict;

 
# PDBファイルの保存先
my $pdb = '1ALK.pdb';
 
# 変換したFASTAフォーマットのデータを保存する変数
my $fa = {};
 
# 3文字アミノ酸コードから1文字コードに変換するハッシュ
my $amino_code = {
     'ALA' => 'A', 'ARG' => 'R', 'ASN' => 'N', 'ASP' => 'D',
     'CYS' => 'C', 'GLN' => 'Q', 'GLU' => 'E', 'GLY' => 'G',
     'ILE' => 'I', 'LEU' => 'L', 'LYS' => 'K', 'MET' => 'M',
     'PHE' => 'F', 'PRO' => 'P', 'SER' => 'S', 'THR' => 'T',
     'TRP' => 'W', 'TYR' => 'Y', 'VAL' => 'V', 'HIS' => 'H',
     'ASX' => 'B', 'GLX' => 'Z', 'UNK' => 'K'
   };
 
 
# PDBファイルを開く
open (my $fh, '<', $pdb) or die;
 
# ファイルを1行ずつ読みながら処理を進める
while (my $buff = <$fh>) {
  # ATOMレコードでなければ次の行に進む
  if ($buff !~ /^ATOM.{9}CA/) {
    next;
  }
 
  # ATOMレコードならばデータを取得
  my $chain = substr($buff, 21, 1);  # チェーン名
  my $num = substr($buff, 22, 4);    # 残基番号
  my $amino = substr($buff, 17, 3);  # アミノ酸コード
 
  # 初期化(初めてチェーン名に出現した時)
  if (!exists $fa->{$chain}) {
    $fa->{$chain} = [];
  }
 
  # 上記ハッシュに含まれるアミノ酸の場合は変換し、含まれない場合はXに変換する
  if (exists $amino_code->{$amino}) {
    $fa->{$chain}->[$num] = $amino_code->{$amino};
  } else {
    $fa->{$chain}->[$num] = 'X';
  }
}
 
# ファイルを閉じる
close($fh);
 
 
# PDB IDをファイル名から取得
$pdb =~ /(.+)\.[^\.]+$/;
my $pdb_id = $1;
 
 

# ファイルへFASTA形式での書き出し
open(my $fh, '>', $pdb_id . '.fa') or die;
# チェーンの名前をソートする
#(ハッシュを利用しているためにソートしないと、チェーン名がランダムに出力される)
foreach my $key (sort keys %{$fa}) {
  print $fh ">$pdb_id;$key\n";
    for (my $i = 1; $i < @{$fa->{$key}}; $i++) {
      # 立体情報がなかった残基のチェーン名と残基番号を画面に出力
      if (!defined $fa->{$key}->[$i]) {
        print STDERR "$key:  $i\n";
      }
      # アミノ酸配列をファイルに出力
      print $fh $fa->{$key}->[$i];
    }
  print $fh "\n";
}

使い方。PDB からサンプルデータ(1ALK)をダウンロードして、プログラムと同じ場所に保存して実行する。

perl pdb2fa.pl