Задание 1. Prody и B-факторы часть 1

PDB ID: 4ACJ

Прежде всего было необходимо найти остатки, средний B-фактор атомов которых максимален и минимален, а также ответить на следующие вопросы: "Чему B-фактор равен? Что это за остаток, где он находится? Насколько велик разброс значений B-факторов его атомов? Есть ли тут какие-то закономерности?"

In [25]:
import prody as pd
import numpy as np
from IPython.display import Image
import matplotlib.pyplot as plt
In [3]:
protein = pd.parsePDB('4ACJ')
@> PDB file is found in working directory (4acj.pdb.gz).
@> 1764 atoms and 1 coordinate set(s) were parsed in 0.02s.
In [4]:
mean_betas = [] 
for residue in protein.iterResidues():
    if not residue.getResname() == 'HOH':
        mean_beta = np.mean(residue.getBetas())
        mean_betas.append([residue, mean_beta])
In [5]:
sorted(mean_betas, key=lambda x:x[1])[0] #min_b_factor
Out[5]:
[<Residue: THR 722 from Chain A from 4ACJ (8 atoms)>, 4.4887500000000005]
In [6]:
sorted(mean_betas, key=lambda x:x[1], reverse = True)[0]
Out[6]:
[<Residue: GLU 714 from Chain A from 4ACJ (6 atoms)>, 16.446666666666665]
In [14]:
glu714 = protein.select('resname GLU and chain A and resnum 714')
thr722 = protein.select('resname THR and chain A and resnum 722')

glu714_betas = []
thr722_betas = []

for atom in glu714.iterAtoms():
    beta = np.mean(atom.getBeta())
    glu714_betas.append(beta)
    

for atom in thr722.iterAtoms():
    beta = np.mean(atom.getBeta())
    thr722_betas.append(beta)
    
glu714_diff = np.max(glu714_betas) - np.min(glu714_betas)
thr722_diff = np.max(thr722_betas) - np.min(thr722_betas)

print('Разброс значений B-фактора атомов GLU 714 цепи A: {}'.format(glu714_diff))
print('Разброс значений B-фактора атомов THR 722 цепи A: {}'.format(thr722_diff))
Разброс значений B-фактора атомов GLU 714 цепи A: 3.1099999999999994
Разброс значений B-фактора атомов THR 722 цепи A: 1.2199999999999998

Итак, в итоге мы получили следующую информацию:

Остаток с наименьшим средним B-фактором – треонин 722 цепи A (среднее значение B-фактора: 4.48875).
Остаток с наибольшим средним B-фактором – глутамат 714 цепи A (среднее значение B-фактора: 16.44667).

Разброс значений B-фактора атомов GLU 714 немного выше, чем у THR 722 (3.11 и 1.22 соответственно)

Далее, когда я увидела структуру глазами (рис. 1), я, мягко говоря удивилась, потому что, по моему скромному мнению, глутамат выглядит не так :)

Тогда я решила посмотреть на электронную плотность вокруг этого остатка (рис. 2). Я бы сказала, что "ушки" электронной плотности могут намекать на то, что в тех местах предположительно мы можем ожидать кислороды (или кислород и азот). То есть, возможно, что там вообще должен быть аспартат (может быть произошла замена, т.к. по сиквенсу там должен быть глутамат), который тоже по какой-то ошибке не вписали должным образом в плотность. Но также не исключено, что авторы просто посчитали, что наблюдаемой ЭП недостаточно для того, чтобы вписать туда еще какие-либо атомы кроме тех, что мы можем наблюдать, и осознанно оставили такой вот "глутамат".

Тем не менее, какая наблюдается картина: "глутамат" 714, имеющий больший средний B-фактор и разброс его значений для своих атомов, окружен раствором и торчит "наружу", в то время как треонин 722 находится ближе к центру белка, недалеко от его более структурированных фрагментов, вторичных структур. То есть то, что значения B-фактора для "глутамата" выше - вполне логично, так как в отличие от треонина он намного свободнее. Я могу предположить, что, если бы 714 аминоксилотный остаток был нормально вписан в электронную плотность и не была бы утеряна часть его атомов, среднее значение B-фактора для его атомов было бы выше наблюдаемого, точно так же, как и разброс.

In [21]:
Image('C:/Users/salmo/OneDrive/Рабочий стол/pr3_pymol/pic1.png')
Out[21]:

Рис. 1. Структура 4ACJ. Остатки с наименьшим (зеленый) и наибольшим (малиновый) средним B-фактором.

In [22]:
Image('C:/Users/salmo/OneDrive/Рабочий стол/pr3_pymol/pic2.png')
Out[22]:

Рис. 2. GLU-714 в структуре 4ACJ. Уровень подрезки = 1, carve = 1.5.

Задание 2. Prody и B-факторы часть 2

В этом задании необходимо было для каждого остатка белка вычислить средний B-фактор по его атомам и его центр масс, а также вычислите центр масс всего белка. Далее необходимо найти для каждого остатка расстояние от его центра масс до центра масс белка, построить scatter plot зависимости B-фактора от расстояния до центра белка.

In [23]:
protein_mass_center = pd.calcCenter(protein, weights = protein.getMasses())

distances = []
betas = []

for residue in protein.iterResidues():
    if 'CA' in residue.getNames():
        beta = np.mean(residue.getBetas())
        betas.append(beta)
        
        mass_center = pd.calcCenter(residue, weights=residue.getMasses())
        distance = pd.calcDistance(protein_mass_center, mass_center)
        distances.append(distance)
        
In [26]:
fig, ax = plt.subplots()
ax.scatter(distances, betas, s=1)
ax.set_xlabel('Distance between mass centers, Å')
ax.set_ylabel('Beta factor')
fig.show()
C:\Users\salmo\anaconda3\envs\bioinf7\lib\site-packages\ipykernel_launcher.py:5: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.
  """

Рис. 3. Scatter plot зависимости B-фактора от расстояния до центра белка 4ACJ.

На рис. 3 представлен точечный график зависимости значения B-фактора от расстояния до центра белка 4ACJ. Из графика видно, что при увеличении расстояния от центра масс значение B-фактора растет. По-видимому, это может быть связано с тем, что при удалении от центра масс белка увеличивается и подвижность аминокислотных остатков, иными словами, в близости к центру масс белка у аминокислотных остатков больше соседей вокруг, потенциально способных стабилизировать их положение.

Задание 3. Как работает восстановление функции электронной плотности по экспериментальным данным

Цель практикума: попытаться воспроизвести ход кристаллографического эксперимента на умозрительном и крайне упрощенном примере. Необходимо самостоятельно сгенерировать электронную плотность, разложить ее в ряд Фурье, а затем восстанавливать исходную функцию, имитируя ту или иную степень потери данных в ходе эксперимента.

In [10]:
run compile-func.py -g 30,3,3+24,3,4+2,3.5,5.4+23,3,9.6+7,2.5,10.7
File func.txt created

Рис. 4. Модель электронной плотности одномерной системы атомов (2 молекулы с 3 и 2 атомами соответственно).

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

In [12]:
run func2fourier.py -i func.txt -o out_func.txt
..Done

Далее я рассматривала восстановление функции ЭП по амплитудам и фазам (в полном наборе гармоник без шума, с шумом и в неполном наборе гармоник).

Результаты и параметры всех дальнейших экспериментов я вносила в табл. 1 (скачать). Номера в этой таблице соответствуют номерам графиков (рисунков), приведенных здесь ниже.

Для оценки качества восстановления функции ЭП для данного набора гармоник были использованы критерии качества:
Отличное восстановление – по графику восстановленной функции можно определить положение максимума всех гауссовых слагаемых функции ("атомов")
Хорошее восстановление – можно угадать положение всех максимумов, зная число слагаемых ("атомов"), хотя на восстановленной функции максимумы от атомов не отличимы от шума
Среднее восстановление – положение каких-то атомов определить по восстановленной функции нельзя, других - можно
Плохое восстановление – положение атомов определить не представляется возможным; можно только предсказать примерный размер "молекулы"

Для начала я рассмотрела полный наборы гармоник без шума (6 интервалов: 0-5, 0-10, 0-20, 0-30, 0-40, 0-50), (рис. 5-10).

In [16]:
run fourier-filter.py -i out_func.txt -r 0-5 -o full_clear_0-5.txt
..Done
In [17]:
run fourier2func.py -f func.txt -i full_clear_0-5.txt -o fclear_0-5.txt
File fclear_0-5.txt with function and its recovering is created

Рис. 5. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-5).

Качество восстановления функции ЭП в данном случае плохое, однозначно определить положения атомов не представляется возможным.

In [18]:
run fourier-filter.py -i out_func.txt -r 0-10 -o full_clear_0-10.txt
..Done
In [19]:
run fourier2func.py -f func.txt -i full_clear_0-10.txt -o fclear_0-10.txt
File fclear_0-10.txt with function and its recovering is created

Рис. 6. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-10).

В этом случае восстановление все еще можно охарактеризовать как плохое.

In [20]:
run fourier-filter.py -i out_func.txt -r 0-20 -o full_clear_0-20.txt
..Done
In [21]:
run fourier2func.py -f func.txt -i full_clear_0-20.txt -o fclear_0-20.txt
File fclear_0-20.txt with function and its recovering is created

Рис. 7. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-20).

Восстановление по полному набору гармоник с интервалом 0-20 уже лучше предыдущих, его, наверное, можно уже охарактеризовать как среднее. По крайней мере 1 атом из 5 уже различим.

In [22]:
run fourier-filter.py -i out_func.txt -r 0-30 -o full_clear_0-30.txt
..Done
In [23]:
run fourier2func.py -f func.txt -i full_clear_0-30.txt -o fclear_0-30.txt
File fclear_0-30.txt with function and its recovering is created

Рис. 8. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-30).

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

In [24]:
run fourier-filter.py -i out_func.txt -r 0-40 -o full_clear_0-40.txt
..Done
In [25]:
run fourier2func.py -f func.txt -i full_clear_0-40.txt -o fclear_0-40.txt
File fclear_0-40.txt with function and its recovering is created

Рис. 9. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-40).

Данное восстановление, по моему мнению, отличное. Положение атомов определяется однозначно, шум минимален.

In [26]:
run fourier-filter.py -i out_func.txt -r 0-50 -o full_clear_0-50.txt
..Done
In [27]:
run fourier2func.py -f func.txt -i full_clear_0-50.txt -o fclear_0-50.txt
File fclear_0-50.txt with function and its recovering is created

Рис. 10. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-50).

Ситуация почти аналогична той, что на рис. 9, однако в этом случае восстановление еще лучше, шум вообще почти не виден. Таким образом, можно сделать вывод о том, что качество восстановления увеличивается с длиной интервала гармоник и уже на интервале 0-40 можно добиться высокого сходства с исходной функцией.

Далее я пробовала восстанавливать функции ЭП с зашумлением амплитуд (F = 10%, 50%, 75%) и/или фаз (P = 10%, 50%, 75%), рис. 11-18. Восстановление происходило по полному набору гармоник на интервале 0-40.

In [30]:
run func2fourier.py -i func.txt -o f_F10.txt -F 10
..Done
In [36]:
run fourier-filter.py -i f_F10.txt -r 0-40 -o F10_0-40.txt
..Done
In [37]:
run fourier2func.py -f func.txt -i F10_0-40.txt -o fF10_0-40.txt
File fF10_0-40.txt with function and its recovering is created

Рис. 11. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-40, F = 10%).

Качество восстановления в случае 10% шума амплитуды все еще отличное. Попробуем повысить процент шума амплитуды.

In [33]:
run func2fourier.py -i func.txt -o f_F50.txt -F 50
..Done
In [35]:
run fourier-filter.py -i f_F50.txt -r 0-40 -o F50_0-40.txt
..Done
In [38]:
run fourier2func.py -f func.txt -i F50_0-40.txt -o fF50_0-40.txt
File fF50_0-40.txt with function and its recovering is created

Рис. 12. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-40, F = 50%).

Тут качество хорошее. Положения большинства атомов все еще можно определить, но легкие атомы уже начинают сливаться с шумом.

In [39]:
run func2fourier.py -i func.txt -o f_F75.txt -F 75
..Done
In [40]:
run fourier-filter.py -i f_F75.txt -r 0-40 -o F75_0-40.txt
..Done
In [41]:
run fourier2func.py -f func.txt -i F75_0-40.txt -o fF75_0-40.txt
File fF75_0-40.txt with function and its recovering is created

Рис. 13. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-40, F = 75%).

Качество восстановления в этом случае уже скорее среднее. В целом даже на высоком уровне шума амплитуды качество восстановления функции ЭП более-менее удволетворительное. Теперь попробуем варьировать уровень шума фазы.

In [42]:
run func2fourier.py -i func.txt -o f_P10.txt -P 10
..Done
In [43]:
run fourier-filter.py -i f_P10.txt -r 0-40 -o P10_0-40.txt
..Done
In [44]:
run fourier2func.py -f func.txt -i P10_0-40.txt -o fP10_0-40.txt
File fP10_0-40.txt with function and its recovering is created

Рис. 14. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-40, P = 10%).

Наверное, качество восстановления в этом случае еще можно отнести к отличному, но из-за шумов уже ближе к хорошему.

In [45]:
run func2fourier.py -i func.txt -o f_P50.txt -P 50
..Done
In [46]:
run fourier-filter.py -i f_P50.txt -r 0-40 -o P50_0-40.txt
..Done
In [47]:
run fourier2func.py -f func.txt -i P50_0-40.txt -o fP50_0-40.txt
File fP50_0-40.txt with function and its recovering is created

Рис. 15. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-40, P = 50%).

В данном случае качество восстановления функции ЭП ближе к среднему, часть атомов сливается с шумом, а те, что еще не сливаются, также уже имеют максимуму ниже тех, что мы можем видеть в исходной функции.

In [48]:
run func2fourier.py -i func.txt -o f_P75.txt -P 75
..Done
In [49]:
run fourier-filter.py -i f_P75.txt -r 0-40 -o P75_0-40.txt
..Done
In [50]:
run fourier2func.py -f func.txt -i P75_0-40.txt -o fP75_0-40.txt
File fP75_0-40.txt with function and its recovering is created

Рис. 16. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-40, P = 75%).

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

In [51]:
run func2fourier.py -i func.txt -o f_P10F50.txt -P 10 -F 50
..Done
In [52]:
run fourier-filter.py -i f_P10F50.txt -r 0-40 -o P10F50-40.txt
..Done
In [53]:
run fourier2func.py -f func.txt -i P10F50-40.txt -o fP10F50-40.txt
File fP10F50-40.txt with function and its recovering is created

Рис. 17. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-40, P = 10%, F = 50%).

In [54]:
run func2fourier.py -i func.txt -o f_P50F10.txt -P 50 -F 10
..Done
In [55]:
run fourier-filter.py -i f_P50F10.txt -r 0-40 -o P50F10-40.txt
..Done
In [56]:
run fourier2func.py -f func.txt -i P50F10-40.txt -o fP50F10-40.txt
File fP50F10-40.txt with function and its recovering is created

Рис. 18. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-40, P = 50%, F = 10%).

Шум амплитуд все же позволяет довольно неплохо определять количество атомов, но с увеличением процента шума качество восстановления так или иначе падает. При добавлении шума к фазам качество восстановления падает сильнее. При 75% фазового шума различить количество атомов в молекулах уже не представляется возможным.
При одновременном зашумлении и фаз, и амплитуд в случае комбинации 50% шума к амплитудам и 10% шума к фазам определить количество атомов возможно, однако в противоположном случае наблюдаемая картина сильно хуже. Исходя из этого можно предположить, что высокий процент шума в фазах оказывает более сильное негативное влияние на качество восстановления исходной функции, чем высокий процент шума в амплитудах.

Далее я я рассматривала восстановленные без шумов функции ЭП по различным неполным набором гармоник: 5-40 (88%), 0-9, 12-38 (92%), 0-31, 40 (78%), рис. 19-21.

In [58]:
run fourier-filter.py -i out_func.txt -r 5-40 -o f5_40.txt
..Done
In [59]:
run fourier2func.py -f func.txt -i f5_40.txt -o ff5_40.txt
File ff5_40.txt with function and its recovering is created

Рис. 19. Восстановление функции электронной плотности по неполному набору гармоник (5-40).

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

In [62]:
run fourier-filter.py -i out_func.txt -r 0-9,12-38 -o f0_9_12_38.txt
..Done
In [63]:
run fourier2func.py -f func.txt -i f0_9_12_38.txt -o ff0_9_12_38.txt
File ff0_9_12_38.txt with function and its recovering is created

Рис. 20. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-9,12-38).

Уровень шума не позволяет в данном случае различить пик водорода.

In [64]:
run fourier-filter.py -i out_func.txt -r 0-31,40 -o f0_31_40.txt
..Done
In [65]:
run fourier2func.py -f func.txt -i f0_31_40.txt -o ff0_31_40.txt
File ff0_31_40.txt with function and its recovering is created

Рис. 21. Восстановление функции электронной плотности по полному набору гармоник (интервал гармоник: 0-31, 40).

В данном случае шумы минимальны и все пики отлично различимы.


© Макиевская Кьяра, 2017-2020