Основная ссылка: H:\Term8\Practice2
После некоторых интеллектуальных усилий справляюсь с запуском IPython на kodomo и "перетуннелированием" его порта на порт локали. При ближайшем рассмотрени процесс очень логичный и простой.
ssh -Y agalicina@kodomo.fbb.msu.ru
ipython notebook --no-browser
Внимание! К порту сервера имеет доступ любой, кто знает номер этого порта! Таким образом, IPython notebook - очень ненадежный метод, если не запаролить его. Для этого получаем хэш-код желаемого пароля через IPython:
from IPython.lib import passwd
passwd()
Получаю хэш, который копирую и вставляю в файл ~/.ipython/profile_USERNAME/ipython_notebook_config.py
# Password to use for web authentication
c = get_config()
c.NotebookApp.password = PASSWORD_HASH_HERE
Для того, чтобы найти файл ipython_notebook_config.py нужно сначала создать пользователя на сервере. Для этого достаточно запустить команду в командной строке:
ipython profile create USERNAME
Теперь запускать ноубук нужно с указанием пользователя:
ipython notebook --no-browser --profile=USERNAME
И да, теперь вход в ноутбук запрашивает тот пароль, для которого изначально был получен hash.
ssh -L 8888:localhost:XXXX agalicina@kodomo.fbb.msu.ru
http://localhost:8888/
from xmlrpclib import ServerProxy
from IPython.display import Image
import os, sys
import time
# pymol launching
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]
### Если вывод в графическое окно не нужен, то:
##__main__.pymol_argv = [ 'pymol', '-cp' ]
import pymol
pymol.finish_launching()
from pymol import cmd
Если все прошло успешно, то должно появиться окно с pymol, запущенным на сервере.
Ну, и последнее, что нужно сделать - установить переменные для дальнейшей работы с программами из практикума (по каким-то причинам это не работает, ipython notebook не видит новые переменные и не запускает mopac с ошибкой "Command not found"):
%%bash
export PATH=${PATH}:/home/preps/golovin/progs/bin
export MOPAC_LICENSE=/home/preps/golovin/progs/bin
Нахожу SMILES-нотацию порфирина, записываю в файл на kodomo, перевожу в 3D-структуру и отображаю в PyMol
%%bash
echo "C1=CC2=NC1=CC3=NC(=CC4=NC(=CC5=NC(=C2)C=C5)C=C4)C=C3" > porphyrin.smi
obgen porphyrin.smi > porphyrin.mol
cmd.load("/home/students/y11/agalicina/Term8/Practice2/porphyrin.mol")
cmd.do(
'''
ray 500,500
png images/p1.png
''')
Image(filename='/home/students/y11/agalicina/Term8/Practice2/images/p1.png')
На выходе получилась далеко не плоская молекула, пробую другую нотацию порфирина.
cmd.delete('all')
%%bash
echo "c1c/2[nH]c(c1)/cc/3\nc(/cc/4\[nH]/c(c\c5n/c(c2)/C=C5)/cc4)C=C3" > porphyrin.smi
obgen porphyrin.smi > porphyrin.mol
cmd.load("/home/students/y11/agalicina/Term8/Practice2/porphyrin.mol")
cmd.do(
'''
set valence,1
set valence_mode, 0
ray 500,500
png images/p2.png
''')
Image(filename='/home/students/y11/agalicina/Term8/Practice2/images/p2.png')
# Вид сбоку
cmd.set_view("(-0.7655993103981018,\
0.43343475461006165,\
-0.47538262605667114,\
-0.4332069754600525,\
0.1989416778087616,\
0.8790627717971802,\
0.475589781999588,\
0.8789519667625427,\
0.03545708209276199,\
0.0,\
0.0,\
-27.551538467407227,\
1.7244553565979004,\
5.390379428863525,\
0.08007892966270447,\
21.721843719482422,\
33.38123321533203,\
-20.0)")
cmd.do(
'''
ray 500,500
png images/p3.png
''')
Image(filename='/home/students/y11/agalicina/Term8/Practice2/images/p3.png')
# Ненужных водородов нет, просто сохраняю структуру в .PDB:
cmd.save("porphyrin.pdb")
Создаю входной файл для Mopac из координат pdb:
%%bash
babel -ipdb porphyrin.pdb -omop 1_opt.mop -xk "PM6"
Запускаю MOPAC:
%%bash
MOPAC2009.exe 1_opt.mop
babel -imopout 1_opt.out -opdb 1_opt.pdb
Использование другого параметра:
%%bash
babel -ipdb porphyrin.pdb -omop 2_opt.mop -xk "AM1"
MOPAC2009.exe 2_opt.mop
babel -imopout 2_opt.out -opdb 2_opt.pdb
Смотрю, что получилось с этими двумя опциями и пытаюсь сравнить:
# Вид на кольцо
cmd.set_view("(0.03581596538424492,\
0.9812870621681213,\
-0.18917885422706604,\
-0.999190628528595,\
0.03171350061893463,\
-0.024669542908668518,\
-0.018209027126431465,\
0.18991151452064514,\
0.9816315770149231,\
0.0,\
0.0,\
-27.551538467407227,\
1.7244553565979004,\
5.390379428863525,\
0.08007892966270447,\
21.721843719482422,\
33.38123321533203,\
-20.0)")
cmd.delete('all')
cmd.load("porphyrin.mol")
cmd.load("1_opt.pdb")
cmd.load("2_opt.pdb")
cmd.do(
'''
ray 500,500
png images/p_mopac.png
''')
Image(filename='/home/students/y11/agalicina/Term8/Practice2/images/p_mopac.png')
cmd.do(
'''
hide everything, porphyrin
ray 500,500
png images/p_mopac1.png
''')
Image(filename='/home/students/y11/agalicina/Term8/Practice2/images/p_mopac1.png')
cmd.set_view("(-0.7655993103981018,\
0.43343475461006165,\
-0.47538262605667114,\
-0.4332069754600525,\
0.1989416778087616,\
0.8790627717971802,\
0.475589781999588,\
0.8789519667625427,\
0.03545708209276199,\
0.0,\
0.0,\
-27.551538467407227,\
1.7244553565979004,\
5.390379428863525,\
0.08007892966270447,\
21.721843719482422,\
33.38123321533203,\
-20.0)")
cmd.do(
'''
show lines, porphyrin
ray 500,500
png images/p_mopac2.png
''')
Image(filename='/home/students/y11/agalicina/Term8/Practice2/images/p_mopac2.png')
Как можно увидеть, MOPAC проводит оптимизацию молекулы, причем зависимость от метода есть, но малозаметная. Правда, то, что молекула порфирина не совсем плоская, программа не исправила.
%%bash
cp 1_opt.mop 1_opt_spectr.mop
printf "\ncis c.i.=4 meci oldgeo\nsome description" >> 1_opt_spectr.mop
MOPAC2009.exe 1_opt_spectr.mop
tail -n 20 1_opt_spectr.out | head -n 13
Выдача:
STATE ENERGY (EV) Q.N. SPIN SYMMETRY POLARIZATION
ABSOLUTE RELATIVE X Y Z
1+ 0.000000 0.000000 1+ SINGLET ????
2 1.914250 1.914250 1 TRIPLET ????
3 2.267103 2.267103 2 SINGLET ????
4 2.465049 2.465049 2 TRIPLET ????
5 2.825994 2.825994 3 TRIPLET ????
6 3.364647 3.364647 4 TRIPLET ????
7 3.391904 3.391904 3 SINGLET ???? 0.1657 0.2746 0.0003
8 3.669233 3.669233 4 SINGLET ???? 2.7405 1.6954 0.0004
9 3.871653 3.871653 5 SINGLET ???? 1.2768 2.0618 0.0035
Считаем по формулам: \(E=h\cdot\nu \rightarrow \lambda=\dfrac{c}{\nu}=\dfrac{c\cdot h}{E}\)
Переведем в атомные единицы измерения:
\(a_{0}=\dfrac{c\cdot \hbar}{E_{h}}\)
\([bohr]=\dfrac{[ат.ед.скорости]}{[hartree]}\)
\(a_{0}=\dfrac{137\cdot1}{E_{h}}\), где:
\(E_{h}[hartree]=27,211 3845(23)\cdot E[eV]\),
\(a_{0}[bohr]=0.052917721092(17)\cdot \lambda[nm]\)
\([E]=[eV]\)
def compute_lambda(E):
if not E:
print "Zero enegry"
raise Exception
Eh = 27.211*E
a0 = 137/Eh
l = a0/0.0529
return l
energy_list = [1.914250,2.267103,2.465049,2.825994,3.364647,3.391904,3.669233,3.871653]
state_transitions = [energy_list[i+1]-energy_list[i] for i in range(0,7)]
lambda_full_transitions = [compute_lambda(x) for x in energy_list]
lambda_state_transitions = [compute_lambda(x) for x in state_transitions]
print "\nWavelengths in nm for transitions from zero energy state:\n"+str(lambda_full_transitions)
print "\nWavelengths in nm for transitions between states:\n"+str(lambda_state_transitions)
Провести всю процедуру, что и для порфирина, но для заряженной молекулы O=C1C=CC(=O)C=C1 - дианиона хинона.
%%bash
echo "O=C1C=CC(=O)C=C1" > compound.smi
obgen compound.smi > compound.mol
cmd.delete("all")
cmd.load("compound.mol")
cmd.set_view("(-0.042833708226680756,\
0.9922202229499817,\
-0.11688100546598434,\
-0.9975786209106445,\
-0.036062151193618774,\
0.05944821238517761,\
0.05477065593004227,\
0.11914627254009247,\
0.9913651347160339,\
0.0,\
0.0,\
-14.575573921203613,\
3.622666835784912,\
-0.03835010528564453,\
0.1896916776895523,\
11.491493225097656,\
17.65965461730957,\
-20.0)")
cmd.do(
'''
set valence,1
set valence_mode, 0
ray 500,500
png images/c1.png
''')
cmd.save("compound.pdb")
Image(filename='images/c1.png')
Получили обычный незаряженный хинон. Попробую получить заряженную форму с помощью MOPAC.
%%bash
babel -ipdb compound.pdb -omop 3_opt1.mop -xk "PM6"
printf "PM6 CHARGE=-2\ngg\n\n" > 3_opt.mop
grep O 3_opt1.mop >> 3_opt.mop
printf "\n" >> 3_opt.mop
less 3_opt1.mop >> 3_opt.mop
%%bash
MOPAC2009.exe 3_opt.mop
babel -imopout 3_opt.out -opdb 3_opt.pdb
cmd.delete("all")
cmd.load("3_opt.pdb")
cmd.do(
'''
ray 500,500
png images/c2.png
''')
Image(filename='images/c2.png')
Двойная связь у кислорода сохраняется, хотя это неверно. Вообще, двойные связи строит Pymol, и решает, где отображать делокализацию заряда. Попробую при составлении SMILES надо прописать анион кислорода явно:
%%bash
echo "[O-]C1=CC=C([O-])C=C1" > compound1.smi
obgen compound1.smi > compound1.mol
cmd.delete("all")
cmd.load("compound1.mol")
cmd.do(
'''
ray 500,500
png images/c3.png
''')
cmd.save("compound1.pdb")
Image(filename='images/c3.png')
%%bash
babel -ipdb compound1.pdb -omop 4_opt1.mop -xk "PM6"
printf "PM6 CHARGE=-2\ngg\n\n" > 4_opt.mop
grep O 4_opt1.mop >> 4_opt.mop
printf "\n" >> 4_opt.mop
less 4_opt1.mop >> 4_opt.mop
MOPAC2009.exe 4_opt.mop
babel -imopout 4_opt.out -opdb 4_opt.pdb
cmd.delete("all")
cmd.load("4_opt.pdb")
cmd.do(
'''
ray 500,500
png images/c4.png
''')
Image(filename='images/c4.png')
Вижу, что такая особенность положения двойных связей - происходит от самого python. Буду считать, что MOPAC умнее меня и нарисую ball & stick модель.
cmd.do('bg_color white')
cmd.set('ambient','0')
cmd.set('direct','0.7')
cmd.set('specular','off')
cmd.set("ray_shadow","off")
cmd.do(
'''
set valence,0
show spheres
set sphere_scale, 0.1
ray 500,500
png images/c5.png
''')
Image(filename='images/c5.png')
Наложу молекулы с зарядом и без заряда:
cmd.delete("all")
cmd.set("valence",0)
cmd.load("compound.pdb")
cmd.do("util.cbag compound") # Зеленый цвет для pdb выдачи obgen для SMILES с двойными связями около O
cmd.load("compound1.pdb")
cmd.do("util.cbay compound1") # Желтый цвет для pdb выдачи obgen для SMILES с одинарными связями около O
cmd.load("3_opt.pdb")
cmd.do("util.cbam 3_opt") # Розовый цвет для pdb выдачи MOPAC для SMILES с двойными связями около O
cmd.load("4_opt.pdb")
cmd.do("util.cbab 4_opt") # Синий цвет для pdb выдачи MOPAC для SMILES с одинарными связями около O
cmd.do(
'''
center
zoom
move z,-3
hide lines
show sticks
set stick_radius=0.02
show spheres
set sphere_scale, 0.04
ray 500,500
png images/c6.png
''')
Image(filename='images/c6.png')
Как видно, исходная формула SMILES играет большую роль в геометрии построенных молекул.
cmd.pair_fit("3_opt","compound1")
cmd.pair_fit("4_opt","compound1")
cmd.pair_fit("compound","compound1")
cmd.do("color green, compound") # Зеленый цвет для pdb выдачи obgen для SMILES с двойными связями около O
cmd.do("color yellow, compound1") # Желтый цвет для pdb выдачи obgen для SMILES с одинарными связями около O
cmd.do("color magenta, 3_opt") # Розовый цвет для pdb выдачи MOPAC для SMILES с двойными связями около O
cmd.do("color blue,4_opt") # Синий цвет для pdb выдачи MOPAC для SMILES с одинарными связями около O
cmd.do(
'''
center
zoom
move z,-3
ray 500,500
png images/c7.png
''')
Image(filename='images/c7.png')
В этой структуре атомы O окрашены по тому, в какой модели они находятся, нужно помнить, что они по-прежнему сверху и снизу.
Как видно, сильнее от других отличается стурктура, полученная obgen из SMILES в одинарными связями. При этом CO-связь длиннее, а бензольное кольцо - сжато, его двойные связи длиннее остальны сторон. Это говорит о том, что obgen не учитывает делокализацию заряда и выравнивание длин связей для этой молекулы.
Следующая отличающаяся модель - полученная из SMILES с двойными связями выдачи MOPAC. Можно заметить, что CO-связи в ней немного короче, чем в оставшихся двух моделях. При этом безнзольное кольцо слегка вытянуто в направлении к O-атомам.
Как ни странно, модель, полученная из SMILES с двойной связью obgen и из SMILES с одинарной MOPAC - практически идентичны.
Дан файл td.pdb тимидинового димера, нужно с помощью MOPAC оценить его энергию в заряженном и нейтральном состоянии.
cmd.reinitialize()
cmd.load("td.pdb")
cmd.set_view("(-0.701326310634613,\
-0.7124418020248413,\
-0.023816648870706558,\
-0.3272649645805359,\
0.3514811098575592,\
-0.8771309852600098,\
0.6332755088806152,\
-0.607361376285553,\
-0.47966060042381287,\
0.0,\
0.0,\
-20.163301467895508,\
29.799999237060547,\
34.61433410644531,\
60.675331115722656,\
15.896900177001953,\
24.429702758789062,\
-20.0)"
)
cmd.do(
'''
show spheres
set sphere_scale, 0.05
ray 500,500
png images/td1.png
''')
Image(filename='images/td1.png')
Видно, что молекула "неровная", хотелось бы её оптимизировать.
%%bash
babel -ipdb td.pdb -omop td.mop -xk "PM6"
%%bash
MOPAC2009.exe td.mop
babel -imopout td.out -opdb td1.pdb # td1 - первая оптимизация, модель без заряда
cmd.delete("all")
cmd.load("td1.pdb")
cmd.do(
'''
show spheres
set sphere_scale, 0.05
ray 500,500
png images/td2.png
''')
Image(filename='images/td2.png')
cmd.delete("all")
cmd.load("td1.pdb")
cmd.load("td.pdb")
cmd.do("util.cbag td") # Зеленый для неоптимизированной молекулы
cmd.do("util.cbay td1") # Желтый для оптимизированной молекулы
time.sleep(2)
cmd.do(
'''
show spheres
set sphere_scale, 0.05
ray 500,500
png images/td3.png
''')
Image(filename='images/td3.png')
Димер стал более симметричным, изменились положения водородов метильных групп, тимидиновые кольца стали плоскими, выровнялся квадрат сшивки двух пар соседних углеродов.
Подсчитаю энергию:
%%bash
babel -imopout td.out -omop td1.mop -xk "PM6"
cp td1.mop td1_spectr.mop
printf "\ncis c.i.=4 meci oldgeo\nsome description">> td1_spectr.mop
MOPAC2009.exe td1_spectr.mop
%%bash
tail -n 20 td1_spectr.out | head -n 13
Выдача:
STATE ENERGY (EV) Q.N. SPIN SYMMETRY POLARIZATION
ABSOLUTE RELATIVE X Y Z
1+ 0.000000 0.000000 1+ SINGLET A
2 4.955172 4.955172 1 TRIPLET A
3 5.241099 5.241099 2 TRIPLET A
4 5.273208 5.273208 2 SINGLET A 0.0071 0.0544 0.0020
5 5.550135 5.550135 3 SINGLET A 0.0257 0.0960 0.0505
6 6.162894 6.162894 3 TRIPLET A
7 6.305476 6.305476 4 SINGLET A 0.0137 0.0304 0.0068
8 6.395284 6.395284 4 TRIPLET A
9 6.476016 6.476016 5 SINGLET A 0.0009 0.0152 0.0064
Теперь можно добавить по положительному заряду в тимидиновые кольца и произвести оптимизацию такой модели возбужденного состояния димера.
%%bash
babel -ipdb td1.pdb -omop td1.mop -xk "PM6"
printf "PM6 CHARGE=+2\ngg\n\n" > td1_charged.mop # td1_charged - результат первой оптимизации с зарядом
grep N td1.mop | head -n 2 | tail -n 1 >> td1_charged.mop # заряды располагаем на N3 обоих колец
grep N td1.mop | tail -n 1 >> td1_charged.mop
printf "\n" >> td1_charged.mop
less td1.mop >> td1_charged.mop
MOPAC2009.exe td1_charged.mop
babel -imopout td1_charged.out -opdb td2_charged.pdb # td2_charged - оптимизация результата предыдущей оптимизации, но с зарядом
cmd.delete("all")
cmd.load("td2_charged.pdb")
cmd.load("td1.pdb")
cmd.do("util.cbay td1") # Желтый для незаряженной молекулы
cmd.do("util.cbac td2_charged") # Синий для заряженной молекулы
time.sleep(2)
cmd.do(
'''
show spheres
set sphere_scale, 0.05
ray 500,500
png images/td4.png
''')
cmd.rms("td1","td2_charged") # Видим разницу, но небольшую
Image(filename='images/td4.png')
Теперь подсчитаю энергию:
%%bash
babel -imopout td1_charged.out -omop td2_charged.mop -xk "PM6"
cp td2_charged.mop td2_charged_spectr.mop
printf "\ncis c.i.=4 meci oldgeo\nsome description">> td2_charged_spectr.mop
MOPAC2009.exe td2_charged_spectr.mop
%%bash
tail -n 20 td2_charged_spectr.out | head -n 13
Выдача:
STATE ENERGY (EV) Q.N. SPIN SYMMETRY POLARIZATION
ABSOLUTE RELATIVE X Y Z
1+ 0.000000 0.000000 1+ SINGLET A
2 4.957464 4.957464 1 TRIPLET A
3 5.239384 5.239384 2 TRIPLET A
4 5.274602 5.274602 2 SINGLET A 0.0069 0.0540 0.0021
5 5.549203 5.549203 3 SINGLET A 0.0258 0.0970 0.0502
6 6.164134 6.164134 3 TRIPLET A
7 6.306077 6.306077 4 SINGLET A 0.0138 0.0299 0.0067
8 6.393083 6.393083 4 TRIPLET A
9 6.474037 6.474037 5 SINGLET A 0.0009 0.0150 0.0066
Теперь еще раз оптимизируем систему без заряда (по итогам предыдущей итерации):
%%bash
MOPAC2009.exe td2_charged.mop
babel -imopout td2_charged.out -opdb td3.pdb # td3 - оптимизация результата предыдущей оптимизации, нет заряда
cmd.delete("all")
cmd.load("td3.pdb")
cmd.load("td2_charged.pdb")
cmd.do("util.cbac td2_charged") # Синий для заряженной молекулы
cmd.do("util.cbag td2_charged") # Зеленый для незаряженной молекулы, после второй оптимизации
time.sleep(2)
cmd.do(
'''
show spheres
set sphere_scale, 0.05
ray 500,500
png images/td5.png
''')
cmd.rms("td3","td2_charged") # Видим разницу, но небольшую
Image(filename='images/td5.png')
cmd.delete("all")
cmd.load("td3.pdb")
cmd.load("td1.pdb")
cmd.do("util.cbay td1") # Желтый для незаряженной молекулы
cmd.do("util.cbag td2_charged") # Зеленый для незаряженной молекулы после второй оптимизации
time.sleep(2)
cmd.do(
'''
show spheres
set sphere_scale, 0.05
ray 500,500
png images/td6.png
''')
cmd.rms("td1","td3") # Видим разницу, но небольшую
Image(filename='images/td6.png')
Теперь подсчитаю энергию:
%%bash
babel -imopout td2_charged.out -omop td3.mop -xk "PM6"
cp td3.mop td3_spectr.mop
printf "\ncis c.i.=4 meci oldgeo\nsome description">> td3_spectr.mop
MOPAC2009.exe td3_spectr.mop
%%bash
tail -n 20 td3_spectr.out | head -n 13
Выдача:
STATE ENERGY (EV) Q.N. SPIN SYMMETRY POLARIZATION
ABSOLUTE RELATIVE X Y Z
1+ 0.000000 0.000000 1+ SINGLET A
2 4.957136 4.957136 1 TRIPLET A
3 5.240092 5.240092 2 TRIPLET A
4 5.274514 5.274514 2 SINGLET A 0.0070 0.0541 0.0020
5 5.549612 5.549612 3 SINGLET A 0.0258 0.0967 0.0502
6 6.163186 6.163186 3 TRIPLET A
7 6.305374 6.305374 4 SINGLET A 0.0138 0.0301 0.0067
8 6.393410 6.393410 4 TRIPLET A
9 6.474350 6.474350 5 SINGLET A 0.0009 0.0150 0.0066
`STATE ENERGY I II III 1+ 0.000000 0.000000 0.000000 2 4.955172 4.957464 4.957136 3 5.241099 5.239384 5.240092 4 5.273208 5.274602 5.274514 5 5.550135 5.549203 5.549612 6 6.162894 6.164134 6.163186 7 6.305476 6.306077 6.305374 8 6.395284 6.393083 6.393410 9 6.476016 6.474037 6.474350
Третье состояние больше похоже на первое по большинству энергий. Видимо, это свидетельствует о том, что молекула не возвращается после возбуждения с исходное состояние.