2016-12-19 3 views
-1

Я пытаюсь извлечь только координаты альфа-углевода и построить их в трехмерном представлении. Верхняя половина следующего кода работает нормально, но я не могу представить свои результаты.извлечение и построение координат атома из pdb-файла python

import re 
import glob 
from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 


coord = [] 
pattern = re.compile('ATOM\s{5,}\d+\s{2}CA\s{2,}\w{3}\s\w\s{2,}\d+\s{6}\d+\.\d+\s\d+\.\d+\s{2}\d+\.\d+', flags=re.S) 
for file in glob.glob('file_rank_1.pdb'): 
with open(file) as fp: 
    for result in pattern.findall(fp.read()): 
     output = result[-22:] 
     coord = " ".join(output.split()) 
     coord = coord.replace(" ",",") 
     c = coord.split(',') 
     print(c) 
X,Y,Z = (c) 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_wireframe(X,Y,Z) 
ax.set_xlabel('x axis') 
ax.set_ylabel('y axis') 
ax.set_zlabel('z axis') 
plt.show() 

Мои результаты запуска выше выглядит ...

['72.438', '109.283', '43.980'] 
['75.664', '110.907', '45.079'] 
['74.354', '111.094', '48.594'] 
['73.380', '107.449', '48.722'] 
['76.614', '106.603', '46.958'] 
['79.740', '105.625', '48.895'] 
['82.425', '107.703', '47.318'] 
['80.088', '110.405', '46.265'] 
['78.710', '110.389', '49.818'] 
['82.235', '110.471', '51.200'] 
['82.841', '113.550', '49.133'] 
['79.233', '114.754', '49.675'] 
['78.633', '113.745', '53.295'] 
['77.041', '117.182', '53.503'] 
['73.963', '116.530', '51.505'] 
['73.696', '113.058', '52.933'] 
TypeError: Cannot cast array data from dtype('float64') to dtype('<U32') according to the rule 'safe' 

Приведенный выше код открывает интерфейс графа, но он остается пустым. Существует также полный экран сообщений с красным файлом из интерактивной оболочки, которые я остановил, чтобы попытаться сэкономить место в этом вопросе. Как я могу построить числа, найденные в c? Благодаря

+0

У вас нет каких-либо номеров в 'c'. Это струны. – Goyo

+0

Я попытался превратить их в поплавки, но, должно быть, неправильно использовал команду, так как когда я это сделал, это вызвало больше проблем, чем решений. – pphil206

ответ

0

Есть несколько вещей, которые укажут:

1) В следующем блоке, c список строк не поплавки.

with open(file) as fp: 
    for result in pattern.findall(fp.read()): 
     output = result[-22:] 
     coord = " ".join(output.split()) 
     coord = coord.replace(" ",",") 
     c = coord.split(',') 
     print(c) 

Вы можете изменить их с помощью:

[float(i) for i in c] 

2) При установке X,Y,Z = (c), что c только последний элемент в цикле. Поэтому вы должны append каждый c в пределах петли для сбора всех координат.

3) Вы можете использовать numpy для манипуляций с массивами.

Так что надеюсь следующие будут работать:

import re 
import numpy as np 
import glob 
from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 


points = [] 
pattern = re.compile('ATOM\s{5,}\d+\s{2}CA\s{2,}\w{3}\s\w\s{2,}\d+\s{6}\d+\.\d+\s\d+\.\d+\s{2}\d+\.\d+', flags=re.S) 
for file in glob.glob('file_rank_1.pdb'): 
with open(file) as fp: 
    for result in pattern.findall(fp.read()): 
     output = result[-22:] 
     coord = " ".join(output.split()) 
     coord = coord.replace(" ",",") 
     c = coord.split(',') 
     c = [float(i) for i in c] # change them to float 
     points.append(c) 
     print(c) 

X,Y,Z=np.array(points).T 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_wireframe(X,Y,Z) 
ax.set_xlabel('x axis') 
ax.set_ylabel('y axis') 
ax.set_zlabel('z axis') 
plt.show() 
+1

Спасибо тонну. Это работало как шарм. – pphil206

Смежные вопросы