ProDy. Синтез Фурье.

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

В данном задании нужно было с помощью Prody посчитать самый большой средний по остатку В-фактор и самый маленький. В качестве объекта здесь использовалмя белок из заданий 2 и 3 второго практикума (PDB ID: 7B6I). Ниже представлен код поиска этих остатков.

In [2]:
import prody as pd
import numpy as np
import matplotlib.pyplot as plt
In [3]:
P1 = pd.parsePDB('7b6i')
@> Connecting wwPDB FTP server RCSB PDB (USA).
@> 7b6i downloaded (C:\Users\Маруся\...\7b6i.pdb.gz)
@> PDB download via FTP completed (1 downloaded, 0 failed).
@> 7493 atoms and 1 coordinate set(s) were parsed in 0.19s.
In [5]:
mean_betas = []
for residue in P1.iterResidues():
    if 'CA' in residue.getNames():
        mean_beta = np.mean(residue.getBetas())
        mean_betas.append([residue, mean_beta])
In [6]:
sorted(mean_betas, key=lambda x:x[1])[0]
Out[6]:
[<Residue: THR 318 from Chain A from 7b6i (7 atoms)>, 28.41714285714286]

Аминокислотный остаток с наименьшим В-фактором: Треонин 318 цепи А.

In [7]:
sorted(mean_betas, key=lambda x:x[1], reverse=True)[0]
Out[7]:
[<Residue: HIS 44 from Chain A from 7b6i (10 atoms)>, 120.825]

Аминокислотный остаток с наибольшим В-фактором: Гистидин 44 цепи А.

После того, как были найдены остатки, я отобразила их на картинке в рамках цепи А, т.к. они оба принадлежат этой цепи.

In [12]:
from IPython.display import Image
Image("4_1.png")
Out[12]:

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

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

Задание 2. Prody и В-факторы (Часть 2)

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

In [11]:
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)
In [28]:
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()
C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\figure.py:457: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
  "matplotlib is currently using a non-GUI backend, "

Рисунок 2. Зависимость среднего В-фактора остатков от расстояния между центром масс остатка и белка.

Из рисунка 2 видно, что с увеличением расстояния между центрами масс остатка и белка увеличивается число остатков с более высоким В-фактором. Так на расстоянии 10 Å от центра масс белка В-фактор находится в промежутке примерно от 30 до 60. При этом на расстоянии 40-50 Å наибольшая часть значений В-фактора находится в промежутке от 30 до 100. Это соответствует моим ожиданиям, так так ближе к центру белка положения остатков более определенные, чем положения остатков на переферии белка. Любопытно, что центр масс остатка с максимальным средним значением В-фактора расположен на расстоянии примерно 40 Å от центра масс белка. Это объясняется формой цепи, на который расположен данный остаток. Она имеет форму запятой. Поэтому данный остаток торчит из молекулы, но находятся не на максимальном расстоянии от центра масс. Большинство остатком обладает средним значением В-фактора в диапазоне от 30 до 70. Это означает, что для большинства остатков мы с достаточно большой уверенностью можем сказать, что они расположены на своих местах.

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

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

In [8]:
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
File func.txt created

Рисунок 3. Сгенерированная одномерная электронная плотность.

In [90]:
run func2fourier.py -i func.txt -o fourier.txt
..Done

После того как электронная плотность была сгенерирована и переведена в ряд Фурье, я вносила некоторый шум и смотрела на качество воспроизведение исходной функции. Сначала, я пробовала воспроизвести функцию используя разные количества гармоник. Я брала гармоники с 0 до 5, 15, 30 и 40. Результаты представлены ниже.

In [106]:
run fourier-filter.py -i fourier.txt -r 0-5 -o fourier1.txt
..Done
In [107]:
run fourier2func.py -f func.txt -i fourier1.txt -o func1.txt
File func1.txt with function and its recovering is created

Рисунок 4. Восстановление электронной плотности по гармоникам с 0 по 5.

In [108]:
run fourier-filter.py -i fourier.txt -r 0-15 -o fourier2.txt
..Done
In [123]:
run fourier2func.py -f func.txt -i fourier2.txt -o func2.txt
File func2.txt with function and its recovering is created

Рисунок 5. Восстановление электронной плотности по гармоникам с 0 по 15.

In [134]:
run fourier-filter.py -i fourier.txt -r 0-30 -o fourier3.txt
..Done
In [135]:
run fourier2func.py -f func.txt -i fourier3.txt -o func3.txt
File func3.txt with function and its recovering is created

Рисунок 6. Восстановление электронной плотности по гармоникам с 0 по 30.

In [138]:
run fourier-filter.py -i fourier.txt -r 0-40 -o fourier4.txt
..Done
In [139]:
run fourier2func.py -f func.txt -i fourier4.txt -o func4.txt
File func4.txt with function and its recovering is created

Рисунок 7. Восстановление электронной плотности по гармоникам с 0 по 40.

На рисунках 4-7 представлены восстановления исходной электронной плотности по различным количествам начальных гармоник. На электронной плотности, восстановленной по гармоникам с 0 по 5 видно только пики для отдельных молекул, качество восстановления плохое. При наборе гармоник 0-15 видно пик только для одного атома, потому качество среднее, граничащее с плохим. Для набора 0-30 восстановление можно охарактеризовать как хорошее: пики видно хорошо, но шум все равно достаточно сильный. И только по набору гармоник 0-40 качество восстановления отличное: шума практически нет, все пики отлично видны.

Далее я взяла набор гармоник с 0 по 40 и вносила в функцию различный шум для амплитуд и фаз и пыталась оценить качество восстановленной электронной плотности. Сначала я вносила гауссовый шум только для амплитуд на уровне 10%, 40% и 70%. Затем я сделала тоже самое с шумом для фаз. А потом я вносила оба типа шума: 10% шума для амплитуд и 40% для фаз, и наоборот. Код и рисунки представлены ниже.

In [144]:
run func2fourier.py -i func.txt -F 10 -o fourierF10.txt
..Done
In [146]:
run fourier-filter.py -i fourierF10.txt -r 0-40 -o fourierF10.txt
..Done
In [147]:
run fourier2func.py -f func.txt -i fourierF10.txt -o funcF10.txt
File funcF10.txt with function and its recovering is created

Рисунок 8. Восстановление исходной электронной плотности с 10% шумом по амплитудам.

In [148]:
run func2fourier.py -i func.txt -F 40 -o fourierF40.txt
..Done
In [149]:
run fourier-filter.py -i fourierF40.txt -r 0-40 -o fourierF40.txt
..Done
In [150]:
run fourier2func.py -f func.txt -i fourierF40.txt -o funcF40.txt
File funcF40.txt with function and its recovering is created

Рисунок 9. Восстановление исходной электронной плотности с 40% шумом по амплитудам.

In [151]:
run func2fourier.py -i func.txt -F 70 -o fourierF70.txt
..Done
In [152]:
run fourier-filter.py -i fourierF70.txt -r 0-40 -o fourierF70.txt
..Done
In [153]:
run fourier2func.py -f func.txt -i fourierF70.txt -o funcF70.txt
File funcF70.txt with function and its recovering is created

Рисунок 10. Восстановление исходной электронной плотности с 70% шумом по амплитудам.

In [154]:
run func2fourier.py -i func.txt -P 10 -o fourierP10.txt
..Done
In [155]:
run fourier-filter.py -i fourierP10.txt -r 0-40 -o fourierP10.txt
..Done
In [156]:
run fourier2func.py -f func.txt -i fourierP10.txt -o funcP10.txt
File funcP10.txt with function and its recovering is created

Рисунок 11. Восстановление исходной электронной плотности с 10% шумом по фазам.

In [157]:
run func2fourier.py -i func.txt -P 40 -o fourierP40.txt
..Done
In [158]:
run fourier-filter.py -i fourierP40.txt -r 0-40 -o fourierP40.txt
..Done
In [159]:
run fourier2func.py -f func.txt -i fourierP40.txt -o funcP40.txt
File funcP40.txt with function and its recovering is created

Рисунок 12. Восстановление исходной электронной плотности с 40% шумом по фазам.

In [160]:
run func2fourier.py -i func.txt -P 70 -o fourierP70.txt
..Done
In [161]:
run fourier-filter.py -i fourierP70.txt -r 0-40 -o fourierP70.txt
..Done
In [162]:
run fourier2func.py -f func.txt -i fourierP70.txt -o funcP70.txt
File funcP70.txt with function and its recovering is created

Рисунок 13. Восстановление исходной электронной плотности с 70% шумом по фазам.

In [163]:
run func2fourier.py -i func.txt -F 10 -P 40 -o fourierF10P40.txt
..Done
In [164]:
run fourier-filter.py -i fourierF10P40.txt -r 0-40 -o fourierF10P40.txt
..Done
In [165]:
run fourier2func.py -f func.txt -i fourierF10P40.txt -o funcF10P40.txt
File funcF10P40.txt with function and its recovering is created

Рисунок 14. Восстановление исходной электронной плотности с 10% шумом по амплитудам и 40% шумом по фазам.

In [166]:
run func2fourier.py -i func.txt -F 40 -P 10 -o fourierF40P10.txt
..Done
In [167]:
run fourier-filter.py -i fourierF40P10.txt -r 0-40 -o fourierF40P10.txt
..Done
In [168]:
run fourier2func.py -f func.txt -i fourierF40P10.txt -o funcF40P10.txt
File funcF40P10.txt with function and its recovering is created

Рисунок 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%). Код и картинки представлены ниже.

In [173]:
run fourier-filter.py -i fourier.txt -r 2-40 -o fourier2-40.txt
..Done
In [174]:
run fourier2func.py -f func.txt -i fourier2-40.txt -o func2-40.txt
File func2-40.txt with function and its recovering is created

Рисунок 16. Восстановление электронной плотности по неполному набору гармоник 2-40.

In [175]:
run fourier-filter.py -i fourier.txt -r 5-40 -o fourier5-40.txt
..Done
In [176]:
run fourier2func.py -f func.txt -i fourier5-40.txt -o func5-40.txt
File func5-40.txt with function and its recovering is created

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

In [182]:
run fourier-filter.py -i fourier.txt -r 0-17,22-40 -o fourier0-17_22-40.txt
..Done
In [183]:
run fourier2func.py -f func.txt -i fourier0-17_22-40.txt -o func0-17_22-40.txt
File func0-17_22-40.txt with function and its recovering is created

Рисунок 18. Восстановление электронной плотности по неполному набору гармоник 0-17 и 22-40.

In [187]:
run fourier-filter.py -i fourier.txt -r 1-35,39-40 -o fourier1-35_39-40.txt
..Done
In [188]:
run fourier2func.py -f func.txt -i fourier1-35_39-40.txt -o func1-35_39-40.txt
File func1-35_39-40.txt with function and its recovering is created

Рисунок 19. Восстановление электронной плотности по неполному набору гармоник 1-35 и 39-40.

In [190]:
run fourier-filter.py -i fourier.txt -r 0-8,19-38 -o fourier0-8_19-38.txt
..Done
In [191]:
run fourier2func.py -f func.txt -i fourier0-8_19-38.txt -o func0-8_19-38.txt
File func0-8_19-38.txt with function and its recovering is created

Рисунок 20. Восстановление электронной плотности по неполному набору гармоник 0-8 и 19-38.

In [194]:
run fourier-filter.py -i fourier.txt -r 10-39 -o fourier10-39.txt
..Done
In [195]:
run fourier2func.py -f func.txt -i fourier10-39.txt -o func10-39.txt
File func10-39.txt with function and its recovering is created

Рисунок 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%) - среднее. Из этого следует, что даже по неполным наборам гармоник можно восстановить исходную функцию на достаточно высоком уровне.

Кратко характеристика восстановлений приведена в таблице, которую можно скачать по ссылке.