Как прочитать файл pdb и выполнить стыковку на основе FFT с использованием python?
Предположим, у меня есть два файла PDB (один из них выглядит следующим образом)
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
.... . .. ... . . ...... ...... ......
.... . .. ... . . ...... ...... ......
Этот файл можно прочитать на 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-сетки и БПФ. Я хотел знать, как действовать дальше или как-нибудь лучше?
1 ответ
Ответ на первый вопрос: "Как прочитать файл 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])
Сейчас data
является пустым "структурированным массивом", к которому легко получить доступ следующим образом:
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)