В данном задании нужно было с помощью Prody посчитать самый большой средний по остатку В-фактор и самый маленький. В качестве объекта здесь использовалмя белок из заданий 2 и 3 второго практикума (PDB ID: 7B6I). Ниже представлен код поиска этих остатков.
import prody as pd
import numpy as np
import matplotlib.pyplot as plt
P1 = pd.parsePDB('7b6i')
mean_betas = []
for residue in P1.iterResidues():
if 'CA' in residue.getNames():
mean_beta = np.mean(residue.getBetas())
mean_betas.append([residue, mean_beta])
sorted(mean_betas, key=lambda x:x[1])[0]
Аминокислотный остаток с наименьшим В-фактором: Треонин 318 цепи А.
sorted(mean_betas, key=lambda x:x[1], reverse=True)[0]
Аминокислотный остаток с наибольшим В-фактором: Гистидин 44 цепи А.
После того, как были найдены остатки, я отобразила их на картинке в рамках цепи А, т.к. они оба принадлежат этой цепи.
from IPython.display import Image
Image("4_1.png")
Рисунок 1. Остатки с наибольшим (розовый гистидин) и наименьшим (голубой треонин) средними В-факторами.
Поскольку В-фактор обратно пропорционален уровню нашей уверенности в расположении атома, понятно почему остатки с наибольшим и наименьшим средними В-факторами расположены в данных местах. Остаток треонина, обладающий наименьшим средним В-фактором расположен внутри молекулы, у него не особо много возможных положений в подавляющем большинстве молекул кристалла его положение одинаково. При этом остаток гистидина с самым большим средним В-фактором торчит из белка. При кристаллизации его положение не было стабильным и он мог зафиксироваться в разных молекулах кристалла в различных положениях.
В этом задании надо было вычислить для каждого остатка В-фактор и центр масс. Затем вычислить центр масс всего белка и посторить зависимость среднего В-фактора остатка от расстояний от центров масс отстаков до центра масс белка. Код для решения этой задачи представлен ниже.
protein_mass_center = pd.calcCenter(P1, weights=P1.getMasses())
distances = []
betas = []
for residue in P1.iterResidues():
if 'CA' in residue.getNames():
beta = np.mean(residue.getBetas())
betas.append(beta)
mass_center = pd.calcCenter(residue, weights=residue.getMasses())
d = pd.calcDistance(protein_mass_center, mass_center)
distances.append(d)
fig,ax = plt.subplots()
ax.scatter(distances, betas, s=1)
ax.set_xlabel('Расстояние между цетнрами масс, Å')
ax.set_ylabel('В-фактор')
ax.set_xlim(0, 65)
ax.set_ylim(0, 130)
fig.show()
Рисунок 2. Зависимость среднего В-фактора остатков от расстояния между центром масс остатка и белка.
Из рисунка 2 видно, что с увеличением расстояния между центрами масс остатка и белка увеличивается число остатков с более высоким В-фактором. Так на расстоянии 10 Å от центра масс белка В-фактор находится в промежутке примерно от 30 до 60. При этом на расстоянии 40-50 Å наибольшая часть значений В-фактора находится в промежутке от 30 до 100. Это соответствует моим ожиданиям, так так ближе к центру белка положения остатков более определенные, чем положения остатков на переферии белка. Любопытно, что центр масс остатка с максимальным средним значением В-фактора расположен на расстоянии примерно 40 Å от центра масс белка. Это объясняется формой цепи, на который расположен данный остаток. Она имеет форму запятой. Поэтому данный остаток торчит из молекулы, но находятся не на максимальном расстоянии от центра масс. Большинство остатком обладает средним значением В-фактора в диапазоне от 30 до 70. Это означает, что для большинства остатков мы с достаточно большой уверенностью можем сказать, что они расположены на своих местах.
В реальной жизни, в ходе рентгеноструктурного анализа кристаллографы получают амплитуды. Затем тем или иным способом получают фазы и проводят синтез фурье, получая электронную плотность. Целью данного задания было попытаться реконструировать ход кристаллографического эксперимента упрощенном примере. Здесь я сгенерировала одномерную электронную плотность и разложила ее в ряд Фурье с помощью предостваленных скриптов. Код и электронную плотность можно увидеть ниже.
run compile-func.py -g 35.6,3,4.7+24.1,2.8,5.7+2,3.5,10+10.8,3,11.1+30,3,12.5
Рисунок 3. Сгенерированная одномерная электронная плотность.
run func2fourier.py -i func.txt -o fourier.txt
После того как электронная плотность была сгенерирована и переведена в ряд Фурье, я вносила некоторый шум и смотрела на качество воспроизведение исходной функции. Сначала, я пробовала воспроизвести функцию используя разные количества гармоник. Я брала гармоники с 0 до 5, 15, 30 и 40. Результаты представлены ниже.
run fourier-filter.py -i fourier.txt -r 0-5 -o fourier1.txt
run fourier2func.py -f func.txt -i fourier1.txt -o func1.txt
Рисунок 4. Восстановление электронной плотности по гармоникам с 0 по 5.
run fourier-filter.py -i fourier.txt -r 0-15 -o fourier2.txt
run fourier2func.py -f func.txt -i fourier2.txt -o func2.txt
Рисунок 5. Восстановление электронной плотности по гармоникам с 0 по 15.
run fourier-filter.py -i fourier.txt -r 0-30 -o fourier3.txt
run fourier2func.py -f func.txt -i fourier3.txt -o func3.txt
Рисунок 6. Восстановление электронной плотности по гармоникам с 0 по 30.
run fourier-filter.py -i fourier.txt -r 0-40 -o fourier4.txt
run fourier2func.py -f func.txt -i fourier4.txt -o func4.txt
Рисунок 7. Восстановление электронной плотности по гармоникам с 0 по 40.
На рисунках 4-7 представлены восстановления исходной электронной плотности по различным количествам начальных гармоник. На электронной плотности, восстановленной по гармоникам с 0 по 5 видно только пики для отдельных молекул, качество восстановления плохое. При наборе гармоник 0-15 видно пик только для одного атома, потому качество среднее, граничащее с плохим. Для набора 0-30 восстановление можно охарактеризовать как хорошее: пики видно хорошо, но шум все равно достаточно сильный. И только по набору гармоник 0-40 качество восстановления отличное: шума практически нет, все пики отлично видны.
Далее я взяла набор гармоник с 0 по 40 и вносила в функцию различный шум для амплитуд и фаз и пыталась оценить качество восстановленной электронной плотности. Сначала я вносила гауссовый шум только для амплитуд на уровне 10%, 40% и 70%. Затем я сделала тоже самое с шумом для фаз. А потом я вносила оба типа шума: 10% шума для амплитуд и 40% для фаз, и наоборот. Код и рисунки представлены ниже.
run func2fourier.py -i func.txt -F 10 -o fourierF10.txt
run fourier-filter.py -i fourierF10.txt -r 0-40 -o fourierF10.txt
run fourier2func.py -f func.txt -i fourierF10.txt -o funcF10.txt
Рисунок 8. Восстановление исходной электронной плотности с 10% шумом по амплитудам.
run func2fourier.py -i func.txt -F 40 -o fourierF40.txt
run fourier-filter.py -i fourierF40.txt -r 0-40 -o fourierF40.txt
run fourier2func.py -f func.txt -i fourierF40.txt -o funcF40.txt
Рисунок 9. Восстановление исходной электронной плотности с 40% шумом по амплитудам.
run func2fourier.py -i func.txt -F 70 -o fourierF70.txt
run fourier-filter.py -i fourierF70.txt -r 0-40 -o fourierF70.txt
run fourier2func.py -f func.txt -i fourierF70.txt -o funcF70.txt
Рисунок 10. Восстановление исходной электронной плотности с 70% шумом по амплитудам.
run func2fourier.py -i func.txt -P 10 -o fourierP10.txt
run fourier-filter.py -i fourierP10.txt -r 0-40 -o fourierP10.txt
run fourier2func.py -f func.txt -i fourierP10.txt -o funcP10.txt
Рисунок 11. Восстановление исходной электронной плотности с 10% шумом по фазам.
run func2fourier.py -i func.txt -P 40 -o fourierP40.txt
run fourier-filter.py -i fourierP40.txt -r 0-40 -o fourierP40.txt
run fourier2func.py -f func.txt -i fourierP40.txt -o funcP40.txt
Рисунок 12. Восстановление исходной электронной плотности с 40% шумом по фазам.
run func2fourier.py -i func.txt -P 70 -o fourierP70.txt
run fourier-filter.py -i fourierP70.txt -r 0-40 -o fourierP70.txt
run fourier2func.py -f func.txt -i fourierP70.txt -o funcP70.txt
Рисунок 13. Восстановление исходной электронной плотности с 70% шумом по фазам.
run func2fourier.py -i func.txt -F 10 -P 40 -o fourierF10P40.txt
run fourier-filter.py -i fourierF10P40.txt -r 0-40 -o fourierF10P40.txt
run fourier2func.py -f func.txt -i fourierF10P40.txt -o funcF10P40.txt
Рисунок 14. Восстановление исходной электронной плотности с 10% шумом по амплитудам и 40% шумом по фазам.
run func2fourier.py -i func.txt -F 40 -P 10 -o fourierF40P10.txt
run fourier-filter.py -i fourierF40P10.txt -r 0-40 -o fourierF40P10.txt
run fourier2func.py -f func.txt -i fourierF40P10.txt -o funcF40P10.txt
Рисунок 15. Восстановление исходной электронной плотности с 40% шумом по амплитудам и 10% шумом по фазам.
В результате при внесении 10% шума и по амплитудам и по фазам качество оставалось отличным. При 40% шума по амплитудам качество восстановление получилось хорошим, а при таком же уровне шума по фазам - средним. В обоих случаях при 70% шуме качество плохое. При 10% шума по амплитудам и 40% по фазам одновременно качество восстановления я охарактеризовала как среднее, а при 40% шума по амплитудам и 10% по фазам - как хорошее. Таким образом, можно сделать вывод, что искажение фаз портит функцию сильнее, чем искажение амплитуд.
Далее я восстанавливала исходную функцию по неполным наборам гармоник: 2-40 (95%), 5-40 (87,5%), 0-17 и 22-40 (90%), 1-35 и 39-40 (92,5%), 0-8 и 19-37 (73,7%) и 10-39 (74%). Код и картинки представлены ниже.
run fourier-filter.py -i fourier.txt -r 2-40 -o fourier2-40.txt
run fourier2func.py -f func.txt -i fourier2-40.txt -o func2-40.txt
Рисунок 16. Восстановление электронной плотности по неполному набору гармоник 2-40.
run fourier-filter.py -i fourier.txt -r 5-40 -o fourier5-40.txt
run fourier2func.py -f func.txt -i fourier5-40.txt -o func5-40.txt
Рисунок 17. Восстановление электронной плотности по неполному набору гармоник 5-40.
run fourier-filter.py -i fourier.txt -r 0-17,22-40 -o fourier0-17_22-40.txt
run fourier2func.py -f func.txt -i fourier0-17_22-40.txt -o func0-17_22-40.txt
Рисунок 18. Восстановление электронной плотности по неполному набору гармоник 0-17 и 22-40.
run fourier-filter.py -i fourier.txt -r 1-35,39-40 -o fourier1-35_39-40.txt
run fourier2func.py -f func.txt -i fourier1-35_39-40.txt -o func1-35_39-40.txt
Рисунок 19. Восстановление электронной плотности по неполному набору гармоник 1-35 и 39-40.
run fourier-filter.py -i fourier.txt -r 0-8,19-38 -o fourier0-8_19-38.txt
run fourier2func.py -f func.txt -i fourier0-8_19-38.txt -o func0-8_19-38.txt
Рисунок 20. Восстановление электронной плотности по неполному набору гармоник 0-8 и 19-38.
run fourier-filter.py -i fourier.txt -r 10-39 -o fourier10-39.txt
run fourier2func.py -f func.txt -i fourier10-39.txt -o func10-39.txt
Рисунок 21. Восстановление электронной плотности по неполному набору гармоник 10-39.
Для наборов гармоник 2-40 (95%), 5-40 (87,5%), 0-17 и 22-40 (90%), 10-39 (74%) я охарактеризовала качество восстановления как хорошее. Для набора гармоник 1-35 и 39-40 (92,5%) качество получилось отличное, а для набора 0-8 и 19-37 (73,7%) - среднее. Из этого следует, что даже по неполным наборам гармоник можно восстановить исходную функцию на достаточно высоком уровне.
Кратко характеристика восстановлений приведена в таблице, которую можно скачать по ссылке.