Введение

Разность между моделями ЯМР-ансамбля может быть обусловлена подвижностью отдельных участков структуры. В РСА-моделях подвижность в некоторой степени может быть описано величиной В-фактора. Посмотрим, есть ли зависимость между RMSD (среднеквадратичное отклонение) и величиной В-фактора.

Библиотеки, структуры

In [1]:
import matplotlib.pyplot as plt
import numpy as np
import prody as pr
import seaborn as sns
import pandas as pd
In [4]:
structure_NMR = pr.parsePDB('6YEU')
selection_NMR = structure_NMR.select('protein')
hv_NMR = selection_NMR.getHierView()
structure_X_ray = pr.parsePDB('6YIG')
selection_X_ray = structure_X_ray.select('protein')
hv_X_ray = selection_X_ray.getHierView()
@> PDB file is found in working directory (6yeu.pdb.gz).
@> 1626 atoms and 20 coordinate set(s) were parsed in 0.12s.
@> PDB file is found in working directory (6yig.pdb.gz).
@> 1569 atoms and 1 coordinate set(s) were parsed in 0.03s.

Подсчет RMSF и B-факторов для обеих структур

In [5]:
RMSFs = [np.mean(pr.calcRMSF(res)) for res in hv_NMR.iterResidues()]
names_number = [res.getResnum() for res in hv_NMR.iterResidues()]
names_res = [res.getResname() for res in hv_NMR.iterResidues()]
In [6]:
data_NMR = pd.DataFrame(data = {'Name_num': names_number, 'Name_res': names_res, 'RMSF': RMSFs})
data_NMR.head(10)
Out[6]:
Name_num Name_res RMSF
0 1 MET 7.452929
1 2 ALA 5.606175
2 3 GLY 3.772456
3 4 GLN 3.015907
4 5 ASN 1.489299
5 6 PRO 0.920718
6 7 ASN 0.611126
7 8 MET 0.934291
8 9 ASP 0.818132
9 10 GLN 0.264304
In [7]:
B_factors = [np.mean(res.getBetas()) for res in hv_X_ray.iterResidues()]
names_number = [res.getResnum() for res in hv_X_ray.iterResidues()]
names_res = [res.getResname() for res in hv_X_ray.iterResidues()]
In [8]:
data_X_ray = pd.DataFrame(data = {'Name_num': names_number, 'Name_res': names_res, 'B-factor': B_factors})
data_X_ray.head()
Out[8]:
Name_num Name_res B-factor
0 5 ASN 68.613333
1 6 PRO 62.187857
2 7 ASN 63.714286
3 8 MET 63.254118
4 9 ASP 36.211667

Сопоставление аминокислотных остатков структур, построение зависимости

Так как в ЯМР-модели аминокислотных остатков больше, чем в РСА-модели, сопоставим их и построим зависимость RMSF от величины В-фактора.

In [18]:
data_concat = data_NMR.join(data_X_ray.drop(['Name_res'], axis = 1).set_index('Name_num'), on = 'Name_num')
In [19]:
data_concat
Out[19]:
Name_num Name_res RMSF B-factor
0 1 MET 7.452929 NaN
1 2 ALA 5.606175 NaN
2 3 GLY 3.772456 NaN
3 4 GLN 3.015907 NaN
4 5 ASN 1.489299 68.613333
... ... ... ... ...
102 103 ILE 0.476617 23.545263
103 104 ASN 0.735652 29.272857
104 105 LEU 0.761367 57.038947
105 106 SER 1.844754 NaN
106 107 ALA 2.933066 NaN

107 rows × 4 columns

In [21]:
plt.figure(figsize=(10, 8), dpi=80)
plt.suptitle('График зависимости В-фактора от RMSF, полученных по ансамблю структур ЯМР')
ax = []
plt.xlabel('B-factor')
plt.ylabel('RMSF')
plt.xlim(0, 70)
plt.ylim(0, 1.8)
sns.scatterplot(x = data_concat.dropna()['B-factor'], y = data_concat.dropna()['RMSF'])
Out[21]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fc484d8a4d0>

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

Поатомное сопоставление структур

Проведем более точное сравнение между моделями. Авторы предполагают, что квадрат RMSF связан с B-фактором следующим способом: 3B/(8 pi^2). Проверим их предположение.

In [22]:
RMSFs = list(map(lambda x: x**2, pr.calcRMSF(selection_NMR)))
Long_name_NMR = []
Atomtype_NMR = []
for res in hv_NMR.iterResidues():
    for atom in iter(res):
        atom_name = atom.getName()
        res_name = atom.getResname()
        res_num = atom.getResnum()
        Long_name_NMR.append("_".join([str(res_num), str(res_name), str(atom_name)]))
        if 'H' in atom_name:
            Atomtype_NMR.append('H')
        else:
             Atomtype_NMR.append(atom_name)   
In [23]:
Betas = []
Long_name_X_ray = []
Atomtype_X_ray = []
for res in hv_X_ray.iterResidues():
    for atom in iter(res):
        atom_name = atom.getName()
        res_name = atom.getResname()
        res_num = atom.getResnum()
        beta = atom.getBeta()
        Long_name_X_ray.append("_".join([str(res_num), str(res_name), str(atom_name)]))
        Betas.append((3*beta)/(8*(np.pi**2)))
        if 'H' in atom_name:
            Atomtype_X_ray.append('H')
        else:
             Atomtype_X_ray.append(atom_name)   
In [24]:
data_NMR_atoms = pd.DataFrame(data = {'Long_name': Long_name_NMR, 'RMSF': RMSFs, 'Type': Atomtype_NMR})
data_X_ray_atoms = pd.DataFrame(data = {'Long_name': Long_name_X_ray, 'B-factor': Betas, 'Type': Atomtype_X_ray})
In [25]:
data_concat_atoms = data_NMR_atoms[data_NMR_atoms.Type != 'H'].drop(['Type'], axis = 1).join(data_X_ray_atoms[data_X_ray_atoms.Type != 'H'].drop(['Type'], axis = 1).set_index('Long_name'), on = 'Long_name')
In [28]:
plt.figure(figsize=(10, 8), dpi=80)
plt.suptitle('График зависимости RMSF от В-фактора, полученных по ансамблю структур ЯМР, пересчитаанных по формуле')
ax = []
plt.xlabel("В-factor, modified")
plt.ylabel("RMSF**2")
plt.xlim(0, 3)
plt.ylim(-0.5, 8)
sns.scatterplot(x = data_concat_atoms.dropna()['B-factor'], y = data_concat_atoms.dropna()['RMSF'])
Out[28]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fc4849187d0>

Мы видим, что зависимость стала более линейной, чем на прошлом графике, однако ее нельзя назвать строгой: наблюдается очень высокий разброс данных, что позволяет говорить о плохом соответствии наблюдаемых величин формуле.