import numpy as np
import pandas as pd
import prody
import matplotlib.pyplot as plt
import seaborn as sns
import os
import re
from bokeh.palettes import PuBu
Учитываем только категории E, H и C из выдачи dssp.
E - бета-слой, H - спираль, C - петля
def map_struc(path):
num, aa, who = [], [], []
with open(path, 'r') as f:
for s in f:
if s.strip()[0] != '#' and s.strip()[-1] != '.':
num.append(s[7:10])
aa.append(s[13:14])
who.append(s[16:17])
with open(path[:-5]+'.out', 'w') as out:
for n, a, w in zip(num, aa, who):
if a != '!':
if w == ' ' and w != 'E' and w != 'H':
w = 'C'
out.write(str(n) + '\t' + a + '\t' + w + '\n')
for f in os.listdir('/home/julybel/study/3d/prak-08/t3/dssp/'):
if '.dssp' in f:
map_struc('/home/julybel/study/3d/prak-08/t3/dssp/{}'.format(f))
$ P_{ik}=\frac {n_{ik}/{n_i}} {N_k/N} $, где:
$ P_{ik} $ - это propensity аминокислотного остатка i образовывать тип вторичной структуры j
$ n_{ik} $ - это количество остатков i в датасете, образующих тип вторичной структуры j
$ n_i $ - это общее количество остатков i в датасете
$ N_k $ - это общее количество остатков, образующих тип вторичной структуры j во всем датасете
$ N $ - это общее количество остатков в датасете
def calculate_metric(path):
aminoacids = ['V', 'L', 'I', 'A', 'G',
'M', 'P', 'S', 'T', 'C',
'K', 'R', 'H', 'D', 'E',
'W', 'F', 'Y', 'N', 'Q']
types = ['E', 'H', 'C']
matrix = np.zeros((1,3))
for f in os.listdir(path):
if '.out' in f:
dat = pd.read_csv(f, sep='\t', header=None)
matrix = np.vstack((matrix, np.array(dat)))
matrix = matrix[1:,:]
dat = pd.DataFrame({'aa' : matrix[:,1], 'type' : matrix[:,2]})
output = np.zeros((1,3))
for aa in aminoacids:
sp = []
for who in types:
nik = len(dat[(dat['aa'] == aa) & (dat['type'] == who)])
ni = len(dat[dat['aa'] == aa])
Nk = len(dat[dat['type'] == who])
N = len(dat)
Pik = (nik/ni)/(Nk/N)
sp.append(Pik)
output = np.vstack((output, np.array(sp)))
output = output[1:,:]
dat = pd.DataFrame({'E' : output[:,0], 'H' : output[:,1], 'C' : output[:,2]})
rename = {}
for i, j in zip(list(dat.T.columns), aminoacids):
rename[i] = j
dat = dat.T.rename(columns=rename).T
fig, ax = plt.subplots(figsize=(15,7))
sns.heatmap(dat, annot=True, cmap='PuBuGn')
print('Какой тип остатка заметно чаще образует альфа-спирали, чем бета-листы и петли?')
print(*list(dat[dat['H'] > (dat['H'] + dat['E'] + dat['C'])*0.45].index), sep=', ')
print('\nКакой тип остатка заметно чаще образует бета-листы, чем альфа-спирали и петли?')
print(*list(dat[dat['E'] > (dat['H'] + dat['E'] + dat['C'])*0.45].index), sep=', ')
print('\nКакой тип остатка заметно чаще образует петли, чем альфа-спирали и бета-листы?')
print(*list(dat[dat['C'] > (dat['H'] + dat['E'] + dat['C'])*0.45].index), sep=', ')
print('\n')
calculate_metric('/home/julybel/study/3d/prak-08/t3/dssp/')
Стоит сделать ремарку о том, что здесь нельзя говорить о какой-либо строгой статистической достоверности результатов, так как в выборке было очень мало структур.
По итогу получилось, что альфа-спирали заметно чаще включают в себя такие остатки как лизин и глутамат. Возможно, в выборке наших структур эти заряженные аминокислотные остатки, входящие в состав альфа-спиралей, способсвуют формированию водородных связей/солевых мостиков.
Такие аминокислотные остатки как валин, изолейцин, метионин, тирозин чаще участвуют в формировании бета-слоя. Кажется, что гидрофобные валина, изолейцина, метионина будут способствовать формированию гидрофобных ядер, которые часто локализуются между листами бета-слоев. Радикал тирозина будет способствовать формированию водородных связей.
Глицин, пролин, цистеин чаще встречаются (по нашим данным) в составе петель. С пролином это неудивительно, учитывая его строение (он может способствовать формированию поворотов.