2013-04-01 5 views
1

가정하자 나는이 두 PDB 파일 (다음과 같이 그 중 하나입니다)pdb 파일을 읽고 파이썬을 사용하여 FFT 기반 도킹을 수행하는 방법은 무엇입니까?

ATOM  1 N MET A 1  66.104 56.583 -35.505 
ATOM  2 CA MET A 1  66.953 57.259 -36.531 
ATOM  3 C MET A 1  67.370 56.262 -37.627 
ATOM  4 O MET A 1  67.105 55.079 -37.531 
ATOM  5 CB MET A 1  68.227 57.852 -35.867 
ATOM  6 CG MET A 1  67.848 58.995 -34.899 
ATOM  7 SD MET A 1  66.880 58.593 -33.421 
....  . .. ... . .  ...... ...... ...... 
....  . .. ... . .  ...... ...... ...... 

이 파일은 다음과 같은 스크립트를 사용하여 파이썬에서 읽을 수 있습니다.

import sys 
x=[];y=[];z=[] 
res=[] 
Nr=0 
for fn in sys.argv[1:]: 
    f=open(fn,'r') 
    while 1: 
     line=f.readline() 
     if not line: break 
     if line[0:6]=='ATOM ' : 
     rx=float(line[30:38]);ry=float(line[38:46]);rz=float(line[46:54]) 
     if line[21]=='A' : 
      x.append(rx); y.append(ry); z.append(rz) 
      Nr=Nr+1 
      res.append(line[17:20]) 
    for i in range(1,Nr-1): 
     print fn, i, res[i], x[i], y[i], z[i] 
f.close 

는 지금은 N*N*N 차원의 격자를 생성하고 회전 그리드에 분자를 번역하고 싶습니다. 회전 및 평행 이동은 FFT (Fast Fourier Transform)를 사용하여 수행 할 수 있습니다.

내가

import numpy as np 
import fftw as fft 

class Grid3D(object): 

    def __init__(self, grid_dimension): 
     x = y = z = grid_dimension 
     self.grid = np.zeros([x, y, z], dtype=float) 

를 다음과 같이 뭔가를 작성하는 노력이 모든 차원 그리드 및 FFT를 사용하여 두 분자의 도킹을 수행하는 사실이다. 나는 더 나아가거나 더 나은 방법을 진행하는 방법을 알고 싶습니까?

+1

특정 질문은 여기에 있습니다 ... –

+1

1 중심 리셉터클은 중심에서 원점으로 이동합니다. 2. 중심 리간드는 중심에서 질량 중심을 기준으로 조정됩니다. 3. FFT를위한 중심 분자를 ​​포함 할 입방 격자 크기 선택 4. 복소수의 3D 그리드에 점수를 할당하여 수용체를 해독합니다. 5. 입력 방향 리간드를 랜덤 방향으로 돌립니다. 6. 균등하게 분포 된 세트 및 이산화 7. 3D FFT를 실행하여 리간드와 수용체 격자 사이의 컨볼 루션을 계산하고 결과 격자에서 최고 스코어링 위치를 선택하십시오. 8. 총 6,600 개의 리간드 회전 (15 ° 각 샘플링)에 대해 단계 6-7을 반복하십시오. – user2176228

+0

위의 절차를 따르는 잘 알려진 방법이 있습니까? – user2176228

답변

1

당신이 첫 번째 질문, 당신은, 당신이 아주 좋은, 그리고 구현하기가 훨씬 용이하다 numpy.genfromtxt를 사용할 수 있습니다 NumPy와 배열로 끝날하려면

"어떻게 PDB 파일을 읽을 수있는"에 대한 답변 반복적 인 읽기보다 사용하십시오. 그것은 등, 또한 지금

import numpy as np 
data = np.genfromtxt('filename.txt', 
     names = 'ATOM,index,res,MET,A,count,x,y,z', 
     dtype=['S4',int,'S2','S3','S1',int,float,float,float]) 

data 훨씬 더 강력한 파일의 간격을입니다 쉽게로 액세스 할 수있는 NumPy와 "구조적 배열은"다음 : 그것은 무엇을 분명하지 않다

In [13]: data 
Out[13]: 
array([('ATOM', 1, 'N', 'MET', 'A', 1, 66.104, 56.583, -35.505), 
     ('ATOM', 2, 'CA', 'MET', 'A', 1, 66.953, 57.259, -36.531), 
     ('ATOM', 3, 'C', 'MET', 'A', 1, 67.37, 56.262, -37.627), 
     ('ATOM', 4, 'O', 'MET', 'A', 1, 67.105, 55.079, -37.531), 
     ('ATOM', 5, 'CB', 'MET', 'A', 1, 68.227, 57.852, -35.867), 
     ('ATOM', 6, 'CG', 'MET', 'A', 1, 67.848, 58.995, -34.899), 
     ('ATOM', 7, 'SD', 'MET', 'A', 1, 66.88, 58.593, -33.421)], 
     dtype=[('ATOM', 'S4'), ('index', '<i8'), ('el', 'S2'), ('MET', 'S3'), ('A', 'S1'), ('count', '<i8'), ('x', '<f8'), ('y', '<f8'), ('z', '<f8')]) 

In [14]: data['x'] 
Out[14]: array([ 66.104, 66.953, 67.37 , 67.105, 68.227, 67.848, 66.88 ]) 

In [15]: data['y'] 
Out[15]: array([ 56.583, 57.259, 56.262, 55.079, 57.852, 58.995, 58.593]) 

In [16]: data['index'] 
Out[16]: array([1, 2, 3, 4, 5, 6, 7]) 

In [17]: data[3] 
Out[17]: ('ATOM', 4, 'O', 'MET', 'A', 1, 67.105, 55.079, -37.531) 
+0

확인이 정말 좋은 방법입니다. 고마워. 이제 나는 다른 점들의 답을 기다릴 것이다. – user2176228

+1

질문이 두 가지로 나뉘어져 있습니다. 두 가지 질문이 꽤 다르기 때문입니다. 나는 당신의 제목을 읽고 처음에는 파일을 읽는 것에 관한 것이라고 생각했습니다. 데이터를 회전하는 것은 위의 의견에 세부 정보가 포함 된 다른 게시물을 정당화하는 또 다른 질문입니다. – askewchan

+0

askewchan에게 감사드립니다. 나는 별도의 질문을 쓸 것이다. – user2176228