2016-11-22 8 views
0

入力ファイルPDBからNADリガンドIDを鎖方向に抽出しようとしています。次のように私は、出力ファイルを保存したい:入力ファイルが1AHI.pbdで、4つの鎖A、B、C及びDが含まれている場合、出力は別々のファイルでなければなりませんPDBテキストファイルを各行の内容に基づいていくつかのファイルに分割します

1AHI_A.txt 
1AHI_B.txt 
1AHI_C.txt 
1AHI_D.txt 

下の私のスクリプトが期待される出力を与えていません。スクリプト内で論理的な問題があるかもしれません。私はまた、何かエラーを取得しています。

from glob import glob 

in_loc = 'C:/Users/Documents/NAD/NAD/result/test_result_file/' 
out_loc = 'C:/Users/Documents/NAD/NAD/result/test_result_file/output/' 

def test(): 
    fnames = glob(in_loc+'*.pdb') 

    for each in fnames: 
    # This is the new generated file out of input file (.txt). 
     formatted_file = each.replace('pdb', 'txt') 

     formatted_file = formatted_file.replace(in_loc, out_loc) 

    # This is the input file 
     in_f = open(each, 'r') 

    # A new file to be opened. 
     out_f = open(formatted_file, "w") 

    # Filtering results from input file 
     try: 
      out_chain_list = filter_file(in_f) 
      for each_line in out_chain_list: 
       out_f.write(each_line) 

     # Closing all the opened files. 
      out_f.close() 
      in_f.close() 

     except Exception as e: 
      print('Exception for file: ', each, '\n', e) 
      out_f.close() 
      in_f.close() 


def filter_file(in_f): 
    ligand_id = ['NAD'] 
    chain_ids = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] 
    previous_chain_id = None 
    chain_list = [] 
    out_chain_list = [] 

    for each in fnames: 
     for line in map(str.rstrip, fnames): 
      if line[:6] != "HETATM": 
       continue 
      chainID = line[21:22] 
      ligandID = line[11:14].strip() 

      if ligandID in ligandID and chain_id in chain_ids: 

       if chain_id != previous_chain_id: 
        c_ls = [] 

       if c_ls: 
        out_file_name = in_f.name.replace(in_loc, out_loc) 
        out_file_name = out_file_name.replace('.pdb', '_'+previous_chain_id+'.txt') 
        out_file = open(out_file_name, "w") 
        for l in c_ls: 
        out_file.write(l) 
        out_file.close() 

       chain_list.append(line) 
       previous_chain_id = chain_id 

       out_chain_list += c_ls 

    return out_chain_list 

test() 

例:

入力ファイル:何か

HETATM15202 PA NAD A 501 44.008 102.331 5.491 1.00 11.48 P HETATM15203 O1A NAD A 501 43.295 103.140 6.507 1.00 11.48 O HETATM15204 O2A NAD A 501 42.939 101.407 4.919 1.00 11.48 O HETATM15205 O5B NAD A 501 45.052 101.397 6.166 1.00 11.48 O HETATM15247 PA NAD B 501 36.790 111.512 38.592 1.00 11.25 P HETATM15248 O1A NAD B 501 37.248 110.563 37.565 1.00 11.25 O HETATM15249 O2A NAD B 501 35.692 110.795 39.337 1.00 11.25 O HETATM15250 O5B NAD B 501 36.174 112.802 37.915 1.00 11.25 O HETATM15292 PA NAD C 501 100.016 130.669 21.776 1.00 12.28 P HETATM15293 O1A NAD C 501 99.311 131.864 22.293 1.00 12.28 O HETATM15294 O2A NAD C 501 101.501 131.009 21.932 1.00 12.28 O HETATM15295 O5B NAD C 501 99.727 130.510 20.238 1.00 12.28 O HETATM15337 PA NAD D 501 78.237 158.792 22.383 1.00 11.99 P HETATM15338 O1A NAD D 501 79.297 157.907 21.808 1.00 11.99 O HETATM15339 O2A NAD D 501 78.807 160.217 22.362 1.00 11.99 O HETATM15340 O5B NAD D 501 78.069 158.416 23.905 1.00 11.99 O 

のような予想される出力:

1AHI_A.txt:チェーン出力(OUTファイルを置く)

HETATM15202 PA NAD A 501  44.008 102.331 5.491 1.00 11.48   P 
HETATM15203 O1A NAD A 501  43.295 103.140 6.507 1.00 11.48   O 
HETATM15204 O2A NAD A 501  42.939 101.407 4.919 1.00 11.48   O 
HETATM15205 O5B NAD A 501  45.052 101.397 6.166 1.00 11.48   O 

1AHI_B.txt:Bチェーン出力(出力ファイル)

HETATM15247 PA NAD B 501  36.790 111.512 38.592 1.00 11.25   P 
HETATM15248 O1A NAD B 501  37.248 110.563 37.565 1.00 11.25   O 
HETATM15249 O2A NAD B 501  35.692 110.795 39.337 1.00 11.25   O 
HETATM15250 O5B NAD B 501  36.174 112.802 37.915 1.00 11.25   O 

1AHI_C.txt:Cチェーン出力(出力ファイル)

HETATM15292 PA NAD C 501  100.016 130.669 21.776 1.00 12.28   P 
HETATM15293 O1A NAD C 501  99.311 131.864 22.293 1.00 12.28   O 
HETATM15294 O2A NAD C 501  101.501 131.009 21.932 1.00 12.28   O 
HETATM15295 O5B NAD C 501  99.727 130.510 20.238 1.00 12.28   O 

1AHI_D.txt: Dチェイン出力(出力ファイル)

HETATM15337 PA NAD D 501  78.237 158.792 22.383 1.00 11.99   P 
HETATM15338 O1A NAD D 501  79.297 157.907 21.808 1.00 11.99   O 
HETATM15339 O2A NAD D 501  78.807 160.217 22.362 1.00 11.99   O 
HETATM15340 O5B NAD D 501  78.069 158.416 23.905 1.00 11.99   O 

あなたが理解するのを助けるでしょう。

NAD(入力ファイルの3番目の列)を抽出し、出力ファイルをチェーン別に保存したいと考えています。ここで

+0

ほとんどの人はPDBファイルとリガンドに慣れていませんあなたがしようとしていることを説明するためのデータの例を示します。期待される成果とは何か、代わりに何を得るのですか?できるだけ簡単な例に減らしてください。また、エラーメッセージが表示されているかどうかはわかりませんが、そうであればどうしますか? – nekomatic

答えて

0

HETATMで始まり、NADが含まれている入力ファイルとでZAからの手紙からの行を含む、fileNameで指定されたPDBファイルを読み込み、IDが見つかった各リガンドの出力ファイルを書き込みますいくつかのコードです指定された場所:

import os 

fileName = 'C:\\path\\to\\file.pdb' 
baseName = os.path.splitext(fileName)[0] # get filename without extension 

# Read the lines from the input file that have 'HETATM' and 'NAD' in the 
# correct positions into a list: 
with open(fileName) as f: 
    linesNAD = [li for li in f if li[0:6] == 'HETATM' and li[17:20] == 'NAD'] 

# Build a set of the chains found in the lines we have read in: 
chains = {li[21] for li in linesNAD if li[21] in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'} 

# For each chain, create an output file and write the lines for that chain: 
for chain in chains: 
    outfileName = baseName + '_' + chain + '.txt' 
    with open(outfileName, 'w') as o: 
     o.writelines([li for li in linesNAD if li[21] == chain]) 

あなたはように複数の入力ファイルを処理したい場合は、これに追加トラップエラーとすることができるようになります。多くの場合、一連のデータを変換またはフィルタリングするための非常に簡潔な方法であるリストと集合の理解の使用に注意してください。これらの構造の詳細については、Pythonのヘルプを参照してください。

私はこれをPython 3.5でテストしましたが、いくつかの以前のバージョンで動作するはずです。セットコンパウンディションは2.7で利用できると思いますが、with構造体が導入された時期はわかりません。あなたのバージョンで動作しない場合は、元のコードと同じようにファイルを開くだけです(ただし、後でclose()を忘れないようにしてください)。

+0

ありがとう、2000の入力ファイルがあります。どのように入出力ファイル用にディレクトリを使用できますか?私はPythonの新しい私を提案してください – Jone

+0

あなたのコードですでにこれをやったやり方はうまくいくはずです。問題が発生している場合は、Pythonのコマンドラインでステップごとに試してみてください。それを処理しようとするのではなく、各ファイルのパスを出力するだけです。 Pythonで試してみるのは簡単ですし、新しくなったらそれが学ぶ最も良い方法です。もしあなたが再び立ち往生したら、あなたの特定の問題についてここで検索してください(これはおそらく以前に答えられていたでしょう)。見つからない場合は、その特定の問題について新しい質問をしてください。 – nekomatic

関連する問題