import prody
Создаём функцию электронной плотности Гауссовым распределением
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
run func2fourier.py -o fourier.txt
Начинаем эксперименты с полным набором гармоник. Начнём с набора 0-5. На нём видно, что есть некие молекулы, но что-то ещё различить сложно.
run fourier-filter.py -i fourier.txt -o f05.txt -r 0-5
run fourier2func.py -f func.txt -i f05.txt
Набор 0-10. Здесь лучше различимы группы, но отдельные атомы нельзя различить.
run fourier-filter.py -i fourier.txt -o f10.txt -r 0-10
run fourier2func.py -f func.txt -i f10.txt
Набор 0-20. Отдельные атомы уже видны, но близко расположенные ещё сливаются в подобие единого пика. Водород не обнаруживается. Заметный сильный шум.
run fourier-filter.py -i fourier.txt -o f20.txt -r 0-20
run fourier2func.py -f func.txt -i f20.txt
Набор 0-30. Все высокоамплитудные пики атомов хорошо различимы, шум пока остаётся, а водород не обнаруживается.
run fourier-filter.py -i fourier.txt -o f30.txt -r 0-30
run fourier2func.py -f func.txt -i f30.txt
Набор 0-40. Все высокоамплитудные пики атомов хорошо различимы, но шум остаётся, водород от него неотличим и обнаружить его не получится.
run fourier-filter.py -i fourier.txt -o f40.txt -r 0-40
run fourier2func.py -f func.txt -i f40.txt
Набор 0-50. Очень хорошее восстановление, видно всё, включая водород. Шум минимален, хотя перед вторым слева пиком шум можно принять за ещё один водород.
run fourier-filter.py -i fourier.txt -o f50.txt -r 0-50
run fourier2func.py -f func.txt -i f50.txt
Выводы: начиная с набора 0-30, определяются все атомы, а в наборе 0-50 чётко видны все атомы, включая водород, с минимальным шумом. Дальше будем работать с вариациями набора 0-50.
Теперь работаем с зашумлёнными данными, но всё ещё по полному набору гармоник.
Установим шум амплитуды 25%.
run func2fourier.py -o fourF25.txt -F 25
run fourier-filter.py -i fourF25.txt -o f50F25.txt -r 0-50
run fourier2func.py -f func.txt -i f50F25.txt
Установим шум амплитуды 50%.
run func2fourier.py -o fourF50.txt -F 50
run fourier-filter.py -i fourF50.txt -o f50F50.txt -r 0-50
run fourier2func.py -f func.txt -i f50F50.txt
Установим шум амплитуды 75%.
run func2fourier.py -o fourF75.txt -F 75
run fourier-filter.py -i fourF75.txt -o f50F75.txt -r 0-50
run fourier2func.py -f func.txt -i f50F75.txt
Установим шум фазы 25%.
run func2fourier.py -o fourP25.txt -P 25
run fourier-filter.py -i fourP25.txt -o f50P25.txt -r 0-50
run fourier2func.py -f func.txt -i f50P25.txt
Установим шум фазы 50%.
run func2fourier.py -o fourP50.txt -P 50
run fourier-filter.py -i fourP50.txt -o f50P50.txt -r 0-50
run fourier2func.py -f func.txt -i f50P50.txt
Установим шум фазы 75%.
run func2fourier.py -o fourP75.txt -P 75
run fourier-filter.py -i fourP75.txt -o f50P75.txt -r 0-50
run fourier2func.py -f func.txt -i f50P75.txt
Установим шум амплидуды 25% и фазы 25%.
run func2fourier.py -o fourF25P25.txt -F 25 -P 25
run fourier-filter.py -i fourF25P25.txt -o f50F25P25.txt -r 0-50
run fourier2func.py -f func.txt -i f50F25P25.txt
Выводы: теряем водород даже при небольшом шуме как амплитуды, так и фазы (что логично). Работа с зашумлением по амплитуде 25% и 50% требует учесть уровень шума - нужно рассматривать аккуратнее, иначе есть риск принять шумовые пики за дополнительные атомы. Шум амплитуды 75% полностью стирает разницу между реальными пиками и шумом, с такими данными работать нельзя. Шум фазы 25% также требует учесть уровень шума, чтобы правильно определить только реальные атомы. Шум фазы 50% и выше не позволяет работать с данными, высок риск найти атомы там, где их нет. Смешанный шум 25% в целом не даёт лишних пиков и позволяет определить существующие, так что в этом случае определить основные атомы можно.
Попробуем восстановить по неполному набору гармоник.
Начнём с удаления первых двух гармоник (хороший, оптимистично-реалистичный вариант). Если убрать только первые несколько гармоник, то в целом все атомы определяются хорошо, кроме водорода - его в условиях хуже идеальных сложно найти, не добавив при этом молекуле "лишних" водородов - даже тут появится один ложноположительный результат.
run fourier-filter.py -i fourier.txt -o f02_50.txt -r 2-50
run fourier2func.py -f func.txt -i f02_50.txt
Уберём ещё несколько из начала. Как видим, если убрать слишком много первых гармоник, качество падает очень сильно, появляются высокоамплитудный шумовой пик, который выглядит, как ещё одна группа атомов.
run fourier-filter.py -i fourier.txt -o f07_50.txt -r 7-50
run fourier2func.py -f func.txt -i f07_50.txt
Теперь уберём первые две и несколько гармоник из середины диапазона. Тоже появляется шум, но реальные пики отличимы от него хорошо, все атомы определяются.
run fourier-filter.py -i fourier.txt -o f02_10_15_50.txt -r 2-10,15-50
run fourier2func.py -f func.txt -i f02_10_15_50.txt
Теперь уберём первые две и большее число гармоник в середине диапазона. Ситуация аналогичная предыдущей, есть значительный шум, но его можно отфильтровать (если не пытаться, например, определять водород).
run fourier-filter.py -i fourier.txt -o f02_25_35_50.txt -r 2-25,35-50
run fourier2func.py -f func.txt -i f02_25_35_50.txt
Теперь уберём первые две и несколько гармоник ближе к концу диапазона. Все пики, кроме водорода, хорошо различимы, шум для них незначительный.
run fourier-filter.py -i fourier.txt -o f02_40_45_50.txt -r 2-40,45-50
run fourier2func.py -f func.txt -i f02_40_45_50.txt
Выводы: чем больше убираем гармоник, тем хуже качество. При удалении дополнительной группы гармоник меньше всего теряется информации, если эта группа находится ближе к концу диапазона рассматриваемого набора - что вполне логично, мы анализируем практически полный набор гармоник до отсутствующей группы.