如何使用python读取pdb文件并执行基于FFT的对接?

如何使用python读取pdb文件并执行基于FFT的对接?,python,numpy,fft,dft,Python,Numpy,Fft,Dft,假设我有两个PDB文件(其中一个如下所示) 可以使用以下脚本在python中读取此文件 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=

假设我有两个PDB文件(其中一个如下所示)

可以使用以下脚本在python中读取此文件

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(快速傅立叶变换)完成

我试着写一些如下的东西

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)

所有这些实际上是使用3d网格和FFT来实现两个分子的对接。我想知道如何进一步或更好地进行?

第一个问题的答案,“如何读取pdb文件”

如果你想得到一个numpy数组,你可以使用
numpy.genfromtxt
,这非常好,而且比循环阅读更容易实现和使用。它对文件的间距等也更加健壮

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])
现在,
数据
是一个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)
[13]中的
:数据
出[13]:
数组([('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','这里不清楚具体的问题是什么…1基于质心的原点中心受体坐标。2.基于质心的原点中心配体坐标。3.选择立方网格大小以包含中心分子进行FFT 4.离散受体,将分数分配给3D网格复数5.将输入配体旋转至随机方向6.将配体旋转至均匀分布集中的Euler角,并离散化7.执行3D FFT以计算配体和受体网格之间的卷积,并从合成网格8中选择顶部计分位置。重复步骤6–7,共旋转3600个配体(15°角采样)有没有一种众所周知的方法可以遵循上面的过程?您正在使用Python!!或者在这种情况下,您的问题太宽泛了,无法回答。我建议您将其分解成小块,首先尝试自己解决它们,如果您遇到困难,请到这里寻求帮助。对于一般过程的建议,您最好还是向askin寻求帮助g at.你可能还想在谷歌上搜索现成的python解决方案,例如。好吧,这真是一个很好的阅读方式。非常感谢。现在我将等待其他问题的答案。我建议你将你的问题分成两个问题,因为它们非常不同。我读了你的标题,起初假设它只是关于阅读文件。旋转data是另一个问题,将证明另一篇文章的合理性,包括您上述评论中的细节。谢谢askewchan。我将写一个单独的问题。
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)