In [267]:
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 - петля

In [309]:
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')
In [310]:
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 $ - это общее количество остатков в датасете

In [415]:
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')
In [416]:
calculate_metric('/home/julybel/study/3d/prak-08/t3/dssp/')
Какой тип остатка заметно чаще образует альфа-спирали, чем бета-листы и петли?
K, E

Какой тип остатка заметно чаще образует бета-листы, чем альфа-спирали и петли?
V, I, M, Y

Какой тип остатка заметно чаще образует петли, чем альфа-спирали и бета-листы?
G, P, C


Стоит сделать ремарку о том, что здесь нельзя говорить о какой-либо строгой статистической достоверности результатов, так как в выборке было очень мало структур.

По итогу получилось, что альфа-спирали заметно чаще включают в себя такие остатки как лизин и глутамат. Возможно, в выборке наших структур эти заряженные аминокислотные остатки, входящие в состав альфа-спиралей, способсвуют формированию водородных связей/солевых мостиков.

Такие аминокислотные остатки как валин, изолейцин, метионин, тирозин чаще участвуют в формировании бета-слоя. Кажется, что гидрофобные валина, изолейцина, метионина будут способствовать формированию гидрофобных ядер, которые часто локализуются между листами бета-слоев. Радикал тирозина будет способствовать формированию водородных связей.

Глицин, пролин, цистеин чаще встречаются (по нашим данным) в составе петель. С пролином это неудивительно, учитывая его строение (он может способствовать формированию поворотов.