In [1]:
import prody

Задание 0.

Создаём функцию электронной плотности Гауссовым распределением

In [2]:
run compile-func.py -g 25,4,6+23,3,7.5+17,3.4,3.1+2,5.5,13+30,3,14.1+13,3.1,15.3
File func.txt created
<Figure size 640x480 with 1 Axes>
In [3]:
run func2fourier.py -o fourier.txt
..Done

Задание 1.

Начинаем эксперименты с полным набором гармоник. Начнём с набора 0-5. На нём видно, что есть некие молекулы, но что-то ещё различить сложно.

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

Набор 0-10. Здесь лучше различимы группы, но отдельные атомы нельзя различить.

In [6]:
run fourier-filter.py -i fourier.txt -o f10.txt -r 0-10
..Done
In [7]:
run fourier2func.py -f func.txt -i f10.txt
File two_func.txt with function and its recovering is created

Набор 0-20. Отдельные атомы уже видны, но близко расположенные ещё сливаются в подобие единого пика. Водород не обнаруживается. Заметный сильный шум.

In [8]:
run fourier-filter.py -i fourier.txt -o f20.txt -r 0-20
..Done
In [9]:
run fourier2func.py -f func.txt -i f20.txt
File two_func.txt with function and its recovering is created

Набор 0-30. Все высокоамплитудные пики атомов хорошо различимы, шум пока остаётся, а водород не обнаруживается.

In [10]:
run fourier-filter.py -i fourier.txt -o f30.txt -r 0-30
..Done
In [11]:
run fourier2func.py -f func.txt -i f30.txt
File two_func.txt with function and its recovering is created

Набор 0-40. Все высокоамплитудные пики атомов хорошо различимы, но шум остаётся, водород от него неотличим и обнаружить его не получится.

In [12]:
run fourier-filter.py -i fourier.txt -o f40.txt -r 0-40
..Done
In [13]:
run fourier2func.py -f func.txt -i f40.txt
File two_func.txt with function and its recovering is created

Набор 0-50. Очень хорошее восстановление, видно всё, включая водород. Шум минимален, хотя перед вторым слева пиком шум можно принять за ещё один водород.

In [14]:
run fourier-filter.py -i fourier.txt -o f50.txt -r 0-50
..Done
In [15]:
run fourier2func.py -f func.txt -i f50.txt
File two_func.txt with function and its recovering is created

Выводы: начиная с набора 0-30, определяются все атомы, а в наборе 0-50 чётко видны все атомы, включая водород, с минимальным шумом. Дальше будем работать с вариациями набора 0-50.

Задание 2.

Теперь работаем с зашумлёнными данными, но всё ещё по полному набору гармоник.

Установим шум амплитуды 25%.

In [16]:
run func2fourier.py -o fourF25.txt -F 25
..Done
In [17]:
run fourier-filter.py -i fourF25.txt -o f50F25.txt -r 0-50
..Done
In [18]:
run fourier2func.py -f func.txt -i f50F25.txt
File two_func.txt with function and its recovering is created

Установим шум амплитуды 50%.

In [19]:
run func2fourier.py -o fourF50.txt -F 50
..Done
In [20]:
run fourier-filter.py -i fourF50.txt -o f50F50.txt -r 0-50
..Done
In [21]:
run fourier2func.py -f func.txt -i f50F50.txt
File two_func.txt with function and its recovering is created

Установим шум амплитуды 75%.

In [22]:
run func2fourier.py -o fourF75.txt -F 75
..Done
In [23]:
run fourier-filter.py -i fourF75.txt -o f50F75.txt -r 0-50
..Done
In [24]:
run fourier2func.py -f func.txt -i f50F75.txt
File two_func.txt with function and its recovering is created

Установим шум фазы 25%.

In [25]:
run func2fourier.py -o fourP25.txt -P 25
..Done
In [26]:
run fourier-filter.py -i fourP25.txt -o f50P25.txt -r 0-50
..Done
In [27]:
run fourier2func.py -f func.txt -i f50P25.txt
File two_func.txt with function and its recovering is created

Установим шум фазы 50%.

In [28]:
run func2fourier.py -o fourP50.txt -P 50
..Done
In [29]:
run fourier-filter.py -i fourP50.txt -o f50P50.txt -r 0-50
..Done
In [30]:
run fourier2func.py -f func.txt -i f50P50.txt
File two_func.txt with function and its recovering is created

Установим шум фазы 75%.

In [31]:
run func2fourier.py -o fourP75.txt -P 75
..Done
In [32]:
run fourier-filter.py -i fourP75.txt -o f50P75.txt -r 0-50
..Done
In [33]:
run fourier2func.py -f func.txt -i f50P75.txt
File two_func.txt with function and its recovering is created

Установим шум амплидуды 25% и фазы 25%.

In [34]:
run func2fourier.py -o fourF25P25.txt -F 25 -P 25
..Done
In [35]:
run fourier-filter.py -i fourF25P25.txt -o f50F25P25.txt -r 0-50
..Done
In [36]:
run fourier2func.py -f func.txt -i f50F25P25.txt
File two_func.txt with function and its recovering is created

Выводы: теряем водород даже при небольшом шуме как амплитуды, так и фазы (что логично). Работа с зашумлением по амплитуде 25% и 50% требует учесть уровень шума - нужно рассматривать аккуратнее, иначе есть риск принять шумовые пики за дополнительные атомы. Шум амплитуды 75% полностью стирает разницу между реальными пиками и шумом, с такими данными работать нельзя. Шум фазы 25% также требует учесть уровень шума, чтобы правильно определить только реальные атомы. Шум фазы 50% и выше не позволяет работать с данными, высок риск найти атомы там, где их нет. Смешанный шум 25% в целом не даёт лишних пиков и позволяет определить существующие, так что в этом случае определить основные атомы можно.

Задание 3.

Попробуем восстановить по неполному набору гармоник.

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

In [37]:
run fourier-filter.py -i fourier.txt -o f02_50.txt -r 2-50
..Done
In [38]:
run fourier2func.py -f func.txt -i f02_50.txt
File two_func.txt with function and its recovering is created

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

In [39]:
run fourier-filter.py -i fourier.txt -o f07_50.txt -r 7-50
..Done
In [40]:
run fourier2func.py -f func.txt -i f07_50.txt
File two_func.txt with function and its recovering is created

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

In [41]:
run fourier-filter.py -i fourier.txt -o f02_10_15_50.txt -r 2-10,15-50
..Done
In [42]:
run fourier2func.py -f func.txt -i f02_10_15_50.txt
File two_func.txt with function and its recovering is created

Теперь уберём первые две и большее число гармоник в середине диапазона. Ситуация аналогичная предыдущей, есть значительный шум, но его можно отфильтровать (если не пытаться, например, определять водород).

In [43]:
run fourier-filter.py -i fourier.txt -o f02_25_35_50.txt -r 2-25,35-50
..Done
In [44]:
run fourier2func.py -f func.txt -i f02_25_35_50.txt
File two_func.txt with function and its recovering is created

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

In [45]:
run fourier-filter.py -i fourier.txt -o f02_40_45_50.txt -r 2-40,45-50
..Done
In [46]:
run fourier2func.py -f func.txt -i f02_40_45_50.txt
File two_func.txt with function and its recovering is created

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