import matplotlib.pyplot as plt
import numpy as np
import prody as pr
import seaborn as sns
import pandas as pd
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()
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()]
data_NMR = pd.DataFrame(data = {'Name_num': names_number, 'Name_res': names_res, 'RMSF': RMSFs})
data_NMR.head(10)
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()]
data_X_ray = pd.DataFrame(data = {'Name_num': names_number, 'Name_res': names_res, 'B-factor': B_factors})
data_X_ray.head()
data_concat = data_NMR.join(data_X_ray.drop(['Name_res'], axis = 1).set_index('Name_num'), on = 'Name_num')
data_concat
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'])
Мы не наблюдаем яркой линейной зависимости между этими двумя параметрами, однако в целом, с ростом B-фактора растет и величина RMSF, что говорить о том, что различия между моделями ЯМР-ансамбля действительно могут быть обусловлены подвижностью отдельных участков белка.
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)
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)
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})
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')
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'])
Мы видим, что зависимость стала более линейной, чем на прошлом графике, однако ее нельзя назвать строгой: наблюдается очень высокий разброс данных, что позволяет говорить о плохом соответствии наблюдаемых величин формуле.