В данном задании было необходимо определить аминокслотные остатки с наименьшим и наибольшим B-фактором. Я работал со структурой 7BCP. На Рисунке 1 показана боковая цепь аргинина 309, чей средний температурный фактор максимален в данной структуре и составляет 61.69 Å2, и аспарагин 153, чей средний температурный фактор минимален в данной структуре и составляет 21.62 Å2. Аргинин располагается на поверхности глобулы в составе α-спирали и обращен в растворитель, а аспарагин располагается внутри белковой молекулы и участвует в связывании лиганда - глюконовой кислоты (см. Практикум 2), за счет чего его тепловые колебания ослабевают.
Ниже приведены параметры атомов аргинина 309 из записи PDB. Видно, что значения В-фактора принимают значения 42-48 Å2 для атомов остова и 54-64 Å2 для тяжелых атомов боковой цепи. Это может быть объяснено тем, что весь боковой радикал и гуанидиновая группа в частности могут подвергаться более интенсивным тепловым колебаниям в ходе эксперимента, так как соединены только с остовом через одинарные С-С связи.
ATOM 4351 N ARG A 309 -36.589 -11.956 -12.257 1.00 42.56 N ATOM 4352 CA ARG A 309 -37.400 -10.964 -12.974 1.00 48.06 C ATOM 4353 C ARG A 309 -38.852 -10.979 -12.511 1.00 46.27 C ATOM 4354 O ARG A 309 -39.501 -9.943 -12.424 1.00 47.90 O ATOM 4355 CB ARG A 309 -37.399 -11.253 -14.482 1.00 54.28 C ATOM 4356 CG ARG A 309 -35.991 -11.565 -14.985 1.00 56.49 C ATOM 4357 CD ARG A 309 -35.532 -10.622 -16.096 1.00 60.62 C ATOM 4358 NE ARG A 309 -34.074 -10.686 -16.269 1.00 63.67 N ATOM 4359 CZ ARG A 309 -33.308 -9.679 -16.693 1.00 58.21 C ATOM 4360 NH1 ARG A 309 -33.852 -8.511 -17.011 1.00 54.64 N ATOM 4361 NH2 ARG A 309 -31.995 -9.849 -16.823 1.00 64.79 N ATOM 4362 H ARG A 309 -36.206 -12.538 -12.760 1.00 51.07 H ATOM 4363 HA ARG A 309 -37.005 -10.095 -12.802 1.00 57.67 H ATOM 4364 HB2 ARG A 309 -37.966 -12.018 -14.663 1.00 65.14 H ATOM 4365 HB3 ARG A 309 -37.729 -10.475 -14.958 1.00 65.14 H ATOM 4366 HG2 ARG A 309 -35.367 -11.483 -14.248 1.00 67.79 H ATOM 4367 HG3 ARG A 309 -35.975 -12.469 -15.336 1.00 67.79 H ATOM 4368 HD2 ARG A 309 -35.953 -10.877 -16.932 1.00 72.75 H ATOM 4369 HD3 ARG A 309 -35.775 -9.711 -15.868 1.00 72.75 H ATOM 4370 HE ARG A 309 -33.685 -11.430 -16.083 1.00 76.40 H ATOM 4371 HH11 ARG A 309 -34.702 -8.399 -16.944 1.00 65.57 H ATOM 4372 HH12 ARG A 309 -33.354 -7.865 -17.283 1.00 65.57 H ATOM 4373 HH21 ARG A 309 -31.639 -10.609 -16.634 1.00 77.75 H ATOM 4374 HH22 ARG A 309 -31.503 -9.199 -17.096 1.00 77.75 H
import prody
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from IPython.display import Image
structure = prody.parsePDB('7bcp', secondary = True)
@> PDB file is found in working directory (7bcp.pdb.gz). @> 5105 atoms and 1 coordinate set(s) were parsed in 0.05s. @> Secondary structures were assigned to 252 residues.
protein = structure.select('protein and chain A')
prot = protein.toAtomGroup()
df = pd.DataFrame(columns = ['MeanBeta', 'Dist', 'SecStr', 'Color', 'Size'])
color = 'blue'
size = 10
residues_ss = []
pmc = prody.calcCenter(prot, weights = prot.getMasses())
for res in prot.iterResidues():
if "CA" in res.getNames():
ss = res.getSecstrs()
beta = np.mean(res.getBetas())
amc = prody.calcCenter(res, weights = res.getMasses())
dist = prody.calcDistance(pmc, amc)
residues_ss.append([res, beta, dist])
df.loc[str(res.getResname() + str(res.getResnum()))] = [beta, dist, ssk[ss[0]], color, size]
print(df.MeanBeta.idxmax(), max(df.MeanBeta)) # Определили остаток с максимальным средним B-фактором
ARG309 61.69291666666667
print(df.MeanBeta.idxmin(), min(df.MeanBeta)) # Определили остаток с минимальным средним B-фактором
ASN153 21.615714285714287
Image("1_1.png")
В данном задании я рассмотрел средние значения B-факторов аминокислотных остатков в зависимости от удаления
таковых от центра масс белка. На Рисунке 2 представлено распределение этих показателей. Имеется некоторая закономерность, что
с увеличением расстояния от центра масс белка средний В-фактор аминокислоты возрастает. При этом зависимость несколько отличается
от линейной, на больших расстояниях от центра возможны различные средние значения B-фактора. Примечательно, что ASN153, имея
наименьший средний температурный фактор, располагается ближе всего к центру масс молекулы, однако ARG309 не находится
дальше всего от центра масс.
С помощью функционала Prody я установил из какой вторичной структуры происходит каждая аминокислота и решил соотнести этот параметр со средним B-фактором. На Рисунке 3 представлено распределение, аналогичное Рисунку 2, но с раскраской по вторичной структуре. Выраженной закономерности не наблюдается. Остатки, чьи средние B-факторы максимальны, относятся к α-спиралям.
На Рисунке 4
показан box plot для средних температурных факторов из каждого типа вторичной структуры, описанной в данной молекуле белка. Кажется, что B-фактор у аминокислот из β-тяжей ниже, чем у остальных. Однако я бы не спешил делать какой-то вывод о взаимосвязи вторичной структуры и среднего B-фактора. Только остов аминокислоты стабилизирован водородными связями, однако боковые цепи могут быть подвержены более сильным тепловым колебаниям, что увеличит среднее значение B-фактора для аминокислоты.
Также я бы не стал говорить о строгой связи B-фактора с расстоянием от центра масс. На мой взгляд, важнее учитывать доступность растворителя для боковой цепи, в котором она может колебаться более свободно, чем внутри белковой молекулы. Остатки, имеющие доступ к раствору, как правило находятся на границе белковой молекулы и, соответсвенно, дальше от ее центра масс.
df['Color'][df.MeanBeta.idxmax()] = 'red'
df['Color'][df.MeanBeta.idxmin()] = 'green'
df['Size'][df.MeanBeta.idxmax()] = 20
df['Size'][df.MeanBeta.idxmin()] = 20
df['Size'] = pd.to_numeric(df['Size'])
fig, ax = plt.subplots()
fig.set_size_inches(10, 7)
SMALL_SIZE = 14
MEDIUM_SIZE = 16
plt.rc('font', size=SMALL_SIZE)
plt.rc('axes', titlesize=SMALL_SIZE)
plt.rc('axes', labelsize=MEDIUM_SIZE)
plt.rc('xtick', labelsize=SMALL_SIZE)
plt.rc('ytick', labelsize=SMALL_SIZE)
ax.scatter(df['Dist'], df['MeanBeta'], s = df['Size'], color = df['Color'])
ax.set_xlabel('Distance to protein mass center, Å')
ax.set_ylabel('Beta factor')
plt.show()
# Соотнесение однобуквенных кодов вторичной структуры согласно мануалу Prody, стр. 62-63
# https://buildmedia.readthedocs.org/media/pdf/prody/v1.5/prody.pdf
ssk = {'H': 'helix',
'G': 'helix310',
'I': 'helixpi',
'T': 'turn',
'B': 'bridge',
'S': 'bend',
'C': 'coil', # Прочие конформации
'E': 'extended'} # Соответствует тяжам В-листа
fig, ax = plt.subplots()
fig.set_size_inches(10, 7)
SMALL_SIZE = 14
MEDIUM_SIZE = 16
plt.rc('font', size=SMALL_SIZE)
plt.rc('axes', titlesize=SMALL_SIZE)
plt.rc('axes', labelsize=MEDIUM_SIZE)
plt.rc('xtick', labelsize=SMALL_SIZE)
plt.rc('ytick', labelsize=SMALL_SIZE)
sns.scatterplot(x = df['Dist'],y = df['MeanBeta'], hue = df['SecStr'])
ax.set_xlabel('Distance to protein mass center, Å')
ax.set_ylabel('Mean Beta factor')
plt.show()
fig, ax = plt.subplots()
fig.set_size_inches(10, 7)
SMALL_SIZE = 14
MEDIUM_SIZE = 16
plt.rc('font', size=SMALL_SIZE)
plt.rc('axes', titlesize=SMALL_SIZE)
plt.rc('axes', labelsize=MEDIUM_SIZE)
plt.rc('xtick', labelsize=SMALL_SIZE)
plt.rc('ytick', labelsize=SMALL_SIZE)
sns.boxplot(x = df['MeanBeta'],y = df['SecStr'])
ax.set_xlabel('Beta factor')
ax.set_ylabel('Secondary structure')
plt.show()
В данном задании я сгенерировал одномерную функцию электронной плотности для двух трехатомных молекул и затем попытался восстановить ее с помощью различных наборов гармоник ряда Фурье (привет коллоквиуму :) ) и для разного уровня шума.
Таблица с результатами и оценкой качества восстановления.
run ../scripts/compile-func.py -g 25,3,6+38,3,7.5+23,3.4,8.8+2,3.5,13+30,3,14.1+27,3.1,15.3
File func.txt created
run ../scripts/func2fourier.py -o four.txt
..Done
run ../scripts/fourier-filter.py -i four.txt -o f05.txt -r 0-5
..Done
run ../scripts/fourier2func.py -f func.txt -i f05.txt
File two_func.txt with function and its recovering is created
run ../scripts/fourier-filter.py -i four.txt -o f010.txt -r 0-10
..Done
run ../scripts/fourier2func.py -f func.txt -i f010.txt
File two_func.txt with function and its recovering is created
run ../scripts/fourier-filter.py -i four.txt -o f020.txt -r 0-20
..Done
run ../scripts/fourier2func.py -f func.txt -i f020.txt
File two_func.txt with function and its recovering is created
run ../scripts/fourier-filter.py -i four.txt -o f030.txt -r 0-30
..Done
run ../scripts/fourier2func.py -f func.txt -i f030.txt
File two_func.txt with function and its recovering is created
run ../scripts/fourier-filter.py -i four.txt -o f045.txt -r 0-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f045.txt
File two_func.txt with function and its recovering is created
Восстанавливая функцию по первым 5 (Рисунок 6) или 10 (Рисунок 7) гармоникам, удается определить только положение отдельных молекул. На Рисунке 8 показано восстановление уже по гармоникам до n = 20 - стало возможным определить положение "тяжелых атомов". На графике восстановленной функции на Рисунке 9 уже можно предположить местонахождение пика, моделирующего атом водорода, но все же этот пик слабо отличим от других маленьких пиков между "молекулами".
Мне показалось, что на гармонике n = 45 (Рисунок 10) достигается отличное восстановление исходной функции, однозначно определяются положения всех атомов, в том числе "водорода".
run ../scripts/func2fourier.py -o fourF30.txt -F 30
..Done
run ../scripts/fourier-filter.py -i fourF30.txt -o f045F30.txt -r 0-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f045F30.txt
File two_func.txt with function and its recovering is created
run ../scripts/func2fourier.py -o fourF60.txt -F 60
..Done
run ../scripts/fourier-filter.py -i fourF60.txt -o f045F60.txt -r 0-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f045F60.txt
File two_func.txt with function and its recovering is created
run ../scripts/func2fourier.py -o fourP30.txt -P 30
..Done
run ../scripts/fourier-filter.py -i fourP30.txt -o f045P30.txt -r 0-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f045P30.txt
File two_func.txt with function and its recovering is created
run ../scripts/func2fourier.py -o fourP60.txt -P 60
..Done
run ../scripts/fourier-filter.py -i fourP60.txt -o f045P60.txt -r 0-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f045P60.txt
File two_func.txt with function and its recovering is created
run ../scripts/func2fourier.py -o fourP30F30.txt -P 30 -F 30
..Done
run ../scripts/fourier-filter.py -i fourP30F30.txt -o f045P30F30.txt -r 0-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f045P30F30.txt
File two_func.txt with function and its recovering is created
run ../scripts/func2fourier.py -o fourP60F60.txt -P 60 -F 60
..Done
run ../scripts/fourier-filter.py -i fourP60F60.txt -o f045P60F60.txt -r 0-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f045P60F60.txt
File two_func.txt with function and its recovering is created
Как можно было ожидать, при восстановлении функции электронной плотности после добавления шума к амплитудам и фазам, качество снижалось. При увеличении уровня шума с 30 до 60% качество заметно ухудшалось как при изменении амплитуды, так и фазы. Кажется, что одновременное добавление шума к фазам и амплитудам не имеет кумулятивного эффекта, возможно, шум фаз играет более значимую роль в "ухудшении" восстановления по сравнению с аналогичным уровнем шума в амплитудах. Возможно, так происходит потому, что добавление шума в фазы смещает пики не вертикально, а вдоль единственного измерения, что ведет к отклонению пиков от своих координат влево или вправо и совершенно другому наложению гармоник.
Зашумление по фазам, по амплитудам или по обоим параметрам сразу на 30% сохраняло среднее или хорошее качество восстановления. Зашумление по амплитудам на 60% давало среднее качество (Рисунок 12), но такое зашумление фаз или фаз и амплитуд практически лишает возможности установить положение как атомомв, так и молекул (Рисунок 14, 16).
run ../scripts/fourier-filter.py -i four.txt -o f245.txt -r 2-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f245.txt
File two_func.txt with function and its recovering is created
run ../scripts/fourier-filter.py -i four.txt -o f845.txt -r 8-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f845.txt
File two_func.txt with function and its recovering is created
run ../scripts/fourier-filter.py -i four.txt -o f08-1345.txt -r 0-8,13-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f08-1345.txt
File two_func.txt with function and its recovering is created
run ../scripts/fourier-filter.py -i four.txt -o f025-3045.txt -r 0-25,30-45
..Done
run ../scripts/fourier2func.py -f func.txt -i f025-3045.txt
File two_func.txt with function and its recovering is created
run ../scripts/fourier-filter.py -i four.txt -o f045-55.txt -r 0-45,55
..Done
run ../scripts/fourier2func.py -f func.txt -i f045-55.txt
File two_func.txt with function and its recovering is created
Далее производилось восстановление исходной функции по неполному набору гармоник. Убирая из набора нулевую гармонику (константную) и первую (Рисунок 17), чья длина волны в нашем эксперименте 30 Å, можно заметить, что из функции вычли значения функции синуса с таким периодом. При этом местоположение атома водорода все еще определяется, но общая картина получается сильно искаженной.
Убрав по 5 гармоник из начала интервала и ближе к концу, я заметил, что, чем больше гармоник с лучшим разрешением участвует в восстановлении функции, тем меньше потери в качестве восстановления. На Рисунке 19 представлено восстановление без 5 гармоник с низким разрешением - качество восстановления лучше, чем на Рисунке 20, где не использованы 5 гармоник с достаточно высоским разрешением.
При добавлении гармоники с номером выше, чем n = 45 (Рисунок 21), наблюдается снижение колебаний восстановленной функции в местах, где исходная функция = 0, - по сравнению с Рисунком 10.
Для наиболее качественного восстановления электронной плотности желательно иметь как можно больше гармоник. Здесь, как и в настоящем рентгено-структурном эксперименте, чем больше рефлексов с полученными модулями и рассчитанными фазами доступно, тем более детально (не факт, что правильно) можно рассчитать значения электронной плотности. Важны как гармоники как с маленьким разрешением, так и с большим: отсутствие последних может сильно искажать общую картину, даже если детализация высокая (Рисунок 17, 18).
В последнем пункте этого задания я попытался смоделировать ситуацию, когда некоторые рефлексы теряются, что возможнои в настоящем эксперименте. В таком случае не совсем понятно, как определить разрешение для структуры. Как и в случае на Рисунке 21, например, нельзя сказать, что разрешение набора соответствует разрешению гармоники n = 55, так как 9 гармоник с меньшим номером отсутствуют. Я бы предложил указывать для набора гармоник разрешение d такой гармоники, что полнота набора гармоник, которым соответсвуют di >= d, была выше, например, 95%.