ProDy-2. ЯМР vs РСА

Задание 1. Вводное

Мои PDB ID для РСА 5ZF2, для ЯМР 5ZPV.

Они содержат в себе структуру тиоредоксин подобного белка. Разрешение РСА хорошее 1.98 Å, количество моделей ЯМР: засабмиченных 10, рассчитанных 50.

С помощью команды super структуры из двух экспериментов были сопоставлены для дальнейшего анализа. При этом сразу отметим, что в модели ЯМР аминокислот больше, чем в РСА (106 и 103 соответственно).

super.png Рис. 1. Изображение наложенных структур ЯМР (фиолетовый) и РСА (желтый).

На самом деле структуры наложились местами очень хорошо (в основном на участках соответствующим β-листам), а местами имеют сильные расхождения в конформации. Так на рисунке 1 видно сильное отклонение хода α-спиралей в разных экспериментах. Более того есть участки, которые по разному определяются 2-ые сруктуры (рис. 2 демонстрирует участок где в модели РСА находится β-лист, а в моделях ЯМР этот же участок является петлей).

super1.png Рис. 2. Различия ЯМР и РСА моделей в определении 2-ой структуры.

Помимо всего этого удалось увидеть:

  1. Аминокислота, которая имеет различные конформации во всех моделях (Рис. 3) - TRP 27 в РСА и TRP 31 в моделях ЯМР. При этом, если посмотреть на расположение соседей в кристалле РСА видно, что единственное взаимодействие, которое хоть как-то можно притянуть к влияющему на положение аминокислоты - это водородная связь с лигандом соседа - SO4 (хотя расстояние там уж слишком большое). Поэтому и по отличающимся конформациям этой аминокислоты в моделях ЯМР можно сделать предположение, что эта аминокислота находится под очень большим воздействием раствора и из-за связей С-С до ароматичных колец может спокойно вращаться и менять конформацию под действием растворителя. Отличия как раз и можно объяснить тем, что ЯМР проводится в растворе, где такая аминокислота очень подвижна. Плюс могло повлиять то, что кристалл находится при низких температурах, а раствор для ЯМР при 25 градусах, из-за чего тепловое движение очевидно будет больее активное в ЯМР эксперименте.
  2. Важным отличием, наверное, можно указать, что в ЯМР моделях есть водороды, так как их ядра являются ЯМР-активными и их спектры можно регистрировать, а в РСА модели они отсутствуют, вероятно, из-за довольно низкого разрешения 1.98 Å.
  3. Аминокислоты, у которых 1 модель ЯМР сильно отличается от всех остальных и РСА (ARG 86 в РСА или 90 в ЯМР) или РСА отличается от всех моделей ЯМР, которые очень схожи (GLU 83 или 87 в РСА и ЯМР моделях соответственно). (Рис. 4)

fig3.png Рис. 3. Демонстрация TRP 27 в РСА и TRP 31 в ЯМР, которые различаются во всех моделях, с двумя соседями в кристалле для РСА модели.

fig4.png Рис. 4. Демонстрация ARG 86 в РСА или 90 в ЯМР и GLU 83 или 87 в РСА и ЯМР моделях соответственно.

Задание 2. RMSF

In [2]:
import prody
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
In [3]:
nmr_5zpv = prody.parsePDB('5zpv')
pca_5zf2 = prody.parsePDB('5zf2')
nmr_5zpv_prot = nmr_5zpv.select('protein').toAtomGroup()
pca_5zf2_prot = pca_5zf2.select('protein').toAtomGroup()
@> PDB file is found in working directory (5zpv.pdb.gz).
@> 1661 atoms and 10 coordinate set(s) were parsed in 0.07s.
@> PDB file is found in working directory (5zf2.pdb.gz).
@> 922 atoms and 1 coordinate set(s) were parsed in 0.01s.
In [5]:
mean_betas = pd.DataFrame(columns = ['Residue', 'Mean_Beta'])
for res in pca_5zf2_prot.iterResidues():
    if "CA" in res.getNames():
        beta = np.mean(res.getBetas())
        mean_betas.loc[str(res.getResnum())] = [res.getResname(), beta]
In [6]:
mean_betas
Out[6]:
Residue Mean_Beta
0 SER 18.168333
1 VAL 15.061429
2 GLU 21.124444
3 PRO 17.180000
4 TYR 19.765000
... ... ...
98 ASP 23.742500
99 PHE 14.350909
100 LEU 15.888750
101 THR 29.778571
102 ARG 26.498182

103 rows × 2 columns

In [8]:
mean_RMSF = pd.DataFrame(columns = ['Residue', 'Mean_RMSF'])
for res in nmr_5zpv_prot.iterResidues():
    if "CA" in res.getNames():
        rmsf = np.mean(prody.calcRMSF(res))
        mean_RMSF.loc[str(res.getResnum())] = [res.getResname(), rmsf]
In [9]:
mean_RMSF
Out[9]:
Residue Mean_RMSF
1 GLN 4.519497
2 ALA 2.808811
3 ALA 1.932978
4 SER 1.735612
5 VAL 1.383974
... ... ...
102 ASP 1.056192
103 PHE 2.280876
104 LEU 2.104244
105 THR 1.681413
106 ARG 2.945922

106 rows × 2 columns

In [15]:
mean_RMSF.iloc[3:106, 1]
Out[15]:
4      1.735612
5      1.383974
6      1.686767
7      1.461557
8      3.668631
         ...   
102    1.056192
103    2.280876
104    2.104244
105    1.681413
106    2.945922
Name: Mean_RMSF, Length: 103, dtype: float64
In [18]:
fig, ax = plt.subplots()
ax.scatter(mean_betas['Mean_Beta'], mean_RMSF.iloc[3:106, 1], s=3)
ax.set_xlabel('Mean B-factor')
ax.set_ylabel('Mean RMSF')
fig.show()
<ipython-input-18-a74c9ad4faf4>:5: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.
  fig.show()

Рис. 5. График зависимости B-фактора от RMSF.

Из-за одинаковой интерпретации B-фактора и RMSF, как мера подвижности (в данном случае аминокислоты), было бы логично предположить, что с увеличением первого увеличивается и второй. Однако, на полученном мной графике такая зависимость прослеживается довольно слабо. Более того просматриваются интересные выбросы с большим RMSF и достаточно низким B-фактором. Хотя если откинуть верхний левый угол графика, то зависимость будет просматриваться более ясно. Видимо это вызвано шумом в данных и неидеальностью эксперимента.

Задание 3

Водородная связь между атомами остова в ядре белка (в альфа-спирали или бета-листе). Здесь я выбрал ILE 76 O и VAL 21 N. В модели РСА длина такой водородной связи составляет 2.8 Å. В моделях ЯМР аминокислоты имеют номера 80 и 25.

Водородную связь боковых цепей в ядре белка. Белок у меня довольно маленький, а аминокислоты, которые не находятся на поверхности в подавляющем большинстве гидрофобные, а малая доля гидрофильных не имеет в РСА модели соседей способных образовать с ними водородные связи. Однако я нашел аминокислоты из разных вторичных структур, образующих водородную связь. Это LYS 54 NZ и GLU 35 OE1 (из β-листа и α-спирали оответственно). В модели РСА длина такой водородной связи составляет 3.5 Å.

Водородную связь в петлях, выходящих на поверхность глобулы (неважно, какие атомы, остова или боковой цепи). Здесь я выбрал SER 92 N и GLU 90 OE1. В модели РСА длина такой водородной связи составляет 2.8 Å.

In [139]:
dist1 = []
O1 = nmr_5zpv_prot.select('resnum 80 and name O').toAtomGroup()
N1 = nmr_5zpv_prot.select('resnum 25 and name N').toAtomGroup()
for i, j in zip(O1.iterCoordsets(), N1.iterCoordsets()):
    dist1.append(float(prody.calcDistance(i, j)))
In [140]:
dist1
Out[140]:
[3.440441832090757,
 3.627752196608805,
 4.108617407352503,
 3.6548039619109542,
 3.712965526368378,
 3.8219264775764583,
 4.06429095907269,
 3.6124567817483992,
 4.021009574721254,
 3.6855129900734305]
In [141]:
a = len(list(filter(lambda x: x <= 3.5, dist1)))
In [142]:
dist2_1 = []
dist2_2 = []
NZ = nmr_5zpv_prot.select('resnum 58 and name NZ').toAtomGroup()
OE1 = nmr_5zpv_prot.select('resnum 39 and name OE1').toAtomGroup()
OE2 = nmr_5zpv_prot.select('resnum 39 and name OE2').toAtomGroup()
for i, j in zip(OE1.iterCoordsets(), NZ.iterCoordsets()):
    dist2_1.append(float(prody.calcDistance(i, j)))
for i, j in zip(OE2.iterCoordsets(), NZ.iterCoordsets()):
    dist2_2.append(float(prody.calcDistance(i, j)))
In [143]:
dist2 = [min(i,j) for i,j in zip(dist2_1, dist2_2)] # учитываем, что OE1 и OE2 идентичны
b = len(list(filter(lambda x: x <= 3.5, dist2)))
In [144]:
dist3_1 = []
dist3_2 = []
N = nmr_5zpv_prot.select('resnum 96 and name N').toAtomGroup()
OE1 = nmr_5zpv_prot.select('resnum 94 and name OE1').toAtomGroup()
OE2 = nmr_5zpv_prot.select('resnum 94 and name OE2').toAtomGroup()
for i, j in zip(OE1.iterCoordsets(), N.iterCoordsets()):
    dist3_1.append(float(prody.calcDistance(i, j)))
for i, j in zip(OE2.iterCoordsets(), N.iterCoordsets()):
    dist3_2.append(float(prody.calcDistance(i, j)))
In [145]:
dist3 = [min(i,j) for i,j in zip(dist3_1, dist3_2)] # учитываем, что OE1 и OE2 идентичны
c = len(list(filter(lambda x: x <= 3.5, dist3)))
In [146]:
df = pd.DataFrame(columns = ['dist X-ray, Å', 'num_in_NMR', '%_in_NMR', 'min_dist_NMR, Å', 'max_dist_NMR, Å', 'mean_dist_NMR, Å'])
In [147]:
df.loc['ILE 80 O и VAL 25 N', 'dist X-ray, Å'] = 2.8
df.loc['ILE 80 O и VAL 25 N', 'num_in_NMR'] = a
df.loc['ILE 80 O и VAL 25 N', '%_in_NMR'] = a/10*100
df.loc['ILE 80 O и VAL 25 N', 'min_dist_NMR, Å'] = np.round(np.min(dist1), 2)
df.loc['ILE 80 O и VAL 25 N', 'max_dist_NMR, Å'] = np.round(np.max(dist1), 2)
df.loc['ILE 80 O и VAL 25 N', 'mean_dist_NMR, Å'] = np.round(np.median(dist1), 2)

df.loc['LYS 58 NZ и GLU 39 O', 'dist X-ray, Å'] = 3.5
df.loc['LYS 58 NZ и GLU 39 O', 'num_in_NMR'] = b
df.loc['LYS 58 NZ и GLU 39 O', '%_in_NMR'] = b/10*100
df.loc['LYS 58 NZ и GLU 39 O', 'min_dist_NMR, Å'] = np.round(np.min(dist2), 2)
df.loc['LYS 58 NZ и GLU 39 O', 'max_dist_NMR, Å'] = np.round(np.max(dist2), 2)
df.loc['LYS 58 NZ и GLU 39 O', 'mean_dist_NMR, Å'] = np.round(np.median(dist2), 2)

df.loc['SER 96 N и GLU 94 O', 'dist X-ray, Å'] = 2.8
df.loc['SER 96 N и GLU 94 O', 'num_in_NMR'] = c
df.loc['SER 96 N и GLU 94 O', '%_in_NMR'] = c/10*100
df.loc['SER 96 N и GLU 94 O', 'min_dist_NMR, Å'] = np.round(np.min(dist3), 2)
df.loc['SER 96 N и GLU 94 O', 'max_dist_NMR, Å'] = np.round(np.max(dist3), 2)
df.loc['SER 96 N и GLU 94 O', 'mean_dist_NMR, Å'] = np.round(np.median(dist3), 2)
In [148]:
df
Out[148]:
dist X-ray, Å num_in_NMR %_in_NMR min_dist_NMR, Å max_dist_NMR, Å mean_dist_NMR, Å
ILE 80 O и VAL 25 N 2.8 1 10 3.44 4.11 3.7
LYS 58 NZ и GLU 39 O 3.5 0 0 6.54 12.19 10.47
SER 96 N и GLU 94 O 2.8 0 0 5.26 8.04 7

3.1.png Рис. 6. Водородная связь между ILE 76 O и VAL 21 N РСА модели.

3.2.png Рис. 7. Водородная связь между LYS 54 NZ и GLU 35 OE1 РСА модели.

3.3.png Рис. 8. Водородная связь между SER 92 N и GLU 90 OE1 РСА модели.

Исходя из данных в табличке получилось, что выбранные мною водородные связи не сохранились в ЯМР моделях. Если для остатков находящихся в петлях или близко к поверхности это вполне могло быть ожидаемо, то для β-листа это довольно странно.