1

我是python编码的初学者。

我正在研究结构坐标。

我有 1000 个具有 xyz 坐标信息的原子的 pdb 结构。

我的结构可以有任何形状。

我正在努力寻找结构内的中心点。从中心点我想画一个半径为 20 厘米的球体。

                                 X        Y      Z
ATOM      1  N   SER A   1      27.130   7.770  34.390    
ATOM      2  1H  SER A   1      27.990   7.760  34.930     
ATOM      3  2H  SER A   1      27.160   6.960  33.790    
ATOM      4  3H  SER A   1      27.170   8.580  33.790    
ATOM      5  CA  SER A   1      25.940   7.780  35.250    
ATOM      6  CB  SER A   1      25.980   9.090  36.020    
ATOM      7  OG  SER A   1      26.740  10.100  35.320    
ATOM      8  HG  SER A   1      26.750  10.940  35.860    
ATOM      9  C   SER A   1      24.640   7.790  34.460    
ATOM     10  O   SER A   1      24.530   8.510  33.500    
ATOM     11  N   CYS A   2      23.590   7.070  34.760    
ATOM     12  H   CYS A   2      23.590   6.550  35.610    
ATOM     13  CA  CYS A   2      22.420   7.010  33.900    
ATOM     14  CB  CYS A   2      21.620   5.760  34.270    
ATOM     15  SG  CYS A   2      22.480   4.210  33.970    
ATOM     16  C   CYS A   2      21.590   8.220  34.040    
ATOM     17  O   CYS A   2      21.370   8.690  35.160   

我试试这个

from __future__ import division
import math as mean
import numpy as nx
from string import*


infile = open('file.pdb', 'r')           #open my file
text1 = infile.read().split('\n')
infile.close()

text = []
for i in text1:
if i != '':
    text.append(i)

for j in text:
x1 = eval(replace(j[30:38], ' ', ''))         #extract x-coordinate
y1 = eval(replace(j[38:46], ' ', ''))         #extract y-coordinate
z1 = eval(replace(j[46:54], ' ', ''))         #extract z-coordinate

idcord = []
idcord.append(x1); idcord.append(y1); idcord.append(z1)

cenpoint = nx.mean(idcord)   # center point
print cenpoint
4

2 回答 2

1

这里有两个步骤。一种是解析输入文件,这可以很容易地使用numpy.gefromtxt()

a = numpy.genfromtxt("file.pdb", skip_header=1, usecols=[6, 7, 8])

第二步是沿数组的第一个维度对数组进行平均。使用方法的axis=0参数mean()

>>> a.mean(axis=0)
array([ 24.74647059,   7.81117647,  34.64823529])
于 2013-09-10T12:33:15.207 回答
-1

您可能希望为每个轴创建一个值列表,然后获取每个此类列表的平均值。
让我们从读取文件开始,读取文件的方式如下:

xval = []
yval = []
zval = []
with open('file.pdb') as fin:
    for line in fin:
        if line.startswith('ATOM'):
            line_vals = line.strip().split()
            xval.append(line_vals[6])
            yval.append(line_vals[7])
            zval.append(line_vals[8])

然后继续使用 math.mean 计算每个列表的平均值

于 2013-09-10T12:25:25.727 回答