Запустим PyMol для работы в режиме сервера.
from xmlrpclib import ServerProxy
from IPython.display import Image
import os, sys, time
# pymol launching
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]
# __main__.pymol_argv = [ 'pymol', '-cp' ] # to disable GUI
import pymol
from pymol import cmd
pymol.finish_launching()
from IPython.display import Image
defaultImage = '/tmp/pymolimg.png'
def prepareImage(width=300, height=300, sleep=2, filename=defaultImage):
## To save the rendered image
cmd.ray(width, height)
cmd.png('/tmp/pymolimg.png')
time.sleep(sleep)
# Define some shortcuts
def focus(x):
cmd.center(x)
cmd.zoom(x)
На основе SMILES-аннотации порфирина создадим его пространственную структуру. Затем загрузим полученную структуру в PyMol.
%%bash
echo "c1cc2cc3ccc(cc4ccc(cc5ccc(cc1n2)[nH]5)n4)[nH]3 porphyrin" > porphyrin.smi
obgen porphyrin.smi > porphyrin.mol
cmd.do('''
load porphyrin.mol
show spheres, all
set sphere_scale, 0.2
set valence, on
''')
prepareImage(); Image(defaultImage)
Удалим лишние водороды (в GUI, т. к. имена атомов одних элементов одинаковы) и сохраним файл в формате pdb.
cmd.save('porphyrin.pdb', 'porphyrin')
Переформатируем координаты в porphyrin.pdb
для использования как входного файла для Mopac
. С помощью аргумента -xk "PM6"
зададим соответствующий тип параметризации.
%%bash
babel -ipdb porphyrin.pdb -omop porphyrin_1opt.mop -xk "PM6"
Запустим Mopac
. Файл porphyrin_1opt.out
переформатируем в pdb:
%%bash
MOPAC2009.exe porphyrin_1opt.mop
babel -imopout porphyrin_1opt.out -opdb porphyrin_1opt.pdb
Загрузим структуру porphyrin_1opt.pdb
в PyMol.
cmd.do('''
reinit
load porphyrin_1opt.pdb
set valence, on
show spheres, all
set sphere_scale, 0.2
''')
prepareImage(); Image(defaultImage)
Полученная структура, в отличие от исходной, характеризуется плоской геометрией.
cmd.do('''
rotate x, 86
rotate z, -90
''')
prepareImage(); Image(defaultImage)
Проведём оптимизацию с другой параметризацией – AM1
.
%%bash
babel -ipdb porphyrin.pdb -omop porphyrin_AM1.mop -xk "AM1"
MOPAC2009.exe porphyrin_AM1.mop
babel -imopout porphyrin_AM1.out -opdb porphyrin_AM1.pdb
cmd.do('''
reinit
load porphyrin_AM1.pdb
set valence, on
show spheres, all
set sphere_scale, 0.2
''')
prepareImage(); Image(defaultImage)
Полученная структура также является плоской и не имеет значительных отличий от предыдущей (porphyrin_1opt.pdb
). Сравнение файлов porphyrin_AM1.mop
и porphyrin_1opt.mop
приводит к такому же выводу.
Структура, полученная с помощью obgen
, визуально отличается нарушенной (неплоской) геометрией от этих структур.
cmd.do('''
reinit
load porphyrin.mol
set valence, on
show spheres, all
set sphere_scale, 0.2
rotate y, 94
''')
prepareImage(); Image(defaultImage)
Рассчитаем возбуждённые состояния для порфирина (файл porphyrin_1opt.mop
). Для указания программе Mopac
необходимости расчёта возбуждённого состояния добавим в конец файла соответствуюшие строки.
%%bash
cp porphyrin_1opt.mop 1_opt_spectr.mop
echo "
cis c.i.=4 meci oldgeo
For porphyrin spectrum" >> 1_opt_spectr.mop
MOPAC2009.exe 1_opt_spectr.mop
В конце файла можно найти значения энергий для электронных переходов.
%%bash
tail -n19 1_opt_spectr.out | head -n12
Рассчитаем длину волн, при которых происходят эти переходы. Сначала выведем формулу для расчёта, а затем применим её к полученным значениям энергии.
$$ E = h \cdot \nu = h \cdot \frac{c}{\lambda} \Rightarrow \lambda = \frac{h \cdot c}{E} $$
Если размерность энергии – эВ, то решение в численном виде можно записать так:
$$ \lambda = \frac{1.23984193}{E} $$
При этом длина волны λ будет иметь размерность микрометров (μm).
%%bash
tail -n15 1_opt_spectr.out | head -n8 | awk '{print $2}' | \
xargs -n1 echo "1.23984193 /" | bc -l > porphyrin_spectr.miM
cat porphyrin_spectr.miM
Для удобства восприятия выразим полученные значения в нанометрах, округлим до целых и отсортируем по возрастанию.
cat porphyrin_spectr.miM | xargs -n1 echo "1000*" | bc | \
cut -f1 -d'.' | sort -n | xargs -I 'q' echo 'q' nm
Пожалуй, можно сказать, что полученные значения согласуются с литературными данными. Так, в книге Macro to Nano Spectroscopy указывается, что в спектре поглощения порфирина отчётливо выделяются два участка с максимумами поглощения — в ближнем ультрафиолете и в видимой части спекта.
Для молекулы хинона определим геометрию с помощью obgen
и Мopac
.
%%bash
echo "O=C1C=CC(=O)C=C1 quinone" > quinone.smi
obgen quinone.smi > quinone.mol
cmd.do('''
reinit
bg white
set ray_trace_mode, 3
load quinone.mol
show spheres, all
set sphere_scale, 0.2
show sticks, all
set stick_radius, 0.1
zoom all
rotate y, -30
set valence, on
''')
prepareImage(); Image(defaultImage)
# Obtained with obgen
cmd.save('quinone.pdb', 'quinone')
%%bash
babel -ipdb quinone.pdb -omop quinone_1opt.mop -xk "PM6"
MOPAC2009.exe quinone_1opt.mop
babel -imopout quinone_1opt.out -opdb quinone_1opt.pdb
cmd.do('''
reinit
bg white
set ray_trace_mode, 3
load quinone_1opt.pdb
show spheres, all
set sphere_scale, 0.2
show sticks, all
set stick_radius, 0.1
rotate y, 30
zoom all
rotate y, -30
set valence, on
''')
prepareImage(400,350); Image(defaultImage)
# Obtained with Mopac
Полученные структуры имеют плоскую геометрию и сходны между собой. Можно заметить изменение угла CC(=O)C
: в полученной с помощью Mopac
структуре он равен 116.2° (вместо 117.4° в структуре, полученной с помощью obgen
).
Определим также геометрию дианиона этой молекулы.
Для начала в первую строчку файла .mop
добавим CHARGE=-2
. Затем явным способом укажем те атомы, на которых должен находиться отрицательный заряд, – атомы кислорода.
%%bash
cp quinone_1opt.mop quinone_anion.mop
sed -i '' -e 's/PM6/PM6 CHARGE=-2/' -e 's/^O/O(-)/g' quinone_anion.mop
cat quinone_anion.mop
%%bash
MOPAC2009.exe quinone_anion.mop
babel -imopout quinone_anion.out -opdb quinone_anion.pdb
cmd.do('''
reinit
bg white
set ray_trace_mode, 3
load quinone_anion.pdb
show spheres, all
set sphere_scale, 0.2
show sticks, all
set stick_radius, 0.1
rotate y, 30
zoom all
rotate y, -30
set valence, on
''')
prepareImage(400,350); Image(defaultImage)
# For anion
Геометрия структуры дианиона также плоская. Длина связей C=O
увеличилась с 1.2 Å до 1.3 Å. Длины связей C-C
в структуре дианона равны 1.4 Å, в то время как в структуре хинона они составляли 1.3 Å и 1.5 Å.
Известно, что ультрафиолет может превращать тимины в тиминовые димеры. Также известно, что ДНК-фотолиаза при облучении ультрафиолетом восстанавливает основания тиминов до нормального состояния.
Так как вычисления возбуждённых состояний в Mopac
затруднены, сымитируем возбуждение, ионизируя оба кольца, т. е. указывая заряд системы +2. Полученное возбуждённое состояние снова оптимизируем при заряде 0.
%%bash
# 1. Geometry optimization at
babel -ipdb td.pdb -omop td_stage1.mop -xk "PM6"
MOPAC2009.exe td_stage1.mop
babel -imopout td_stage1.out -opdb td_stage1.pdb
%%bash
# 2. Geometry optimization at +2
babel -ipdb td_stage1.pdb -omop td_stage2.mop -xk "PM6"
sed -i 's/PM6/PM6 CHARGE=+2/' td_stage2.mop
MOPAC2009.exe td_stage2.mop
babel -imopout td_stage2.out -opdb td_stage2.pdb
%%bash
# 3. Geometry optimization at 0
babel -ipdb td_stage2.pdb -omop td_stage3.mop -xk "PM6"
MOPAC2009.exe td_stage3.mop
babel -imopout td_stage3.out -opdb td_stage3.pdb
Отобразим полученные структуры в PyMol.
def showPDB(pdb):
cmd.do('''
reinit
bg white
set antialias, 2
set ray_trace_mode, 3
load ''' + pdb + '''
show spheres, all
set sphere_scale, 0.2
show sticks, all
set stick_radius, 0.1
zoom all
set valence, on
''')
showPDB('td_stage1.pdb')
cmd.rotate('y', '-30')
prepareImage(); Image(defaultImage)
# Initial thymine dimer (charge: 0)
showPDB('td_stage2.pdb')
cmd.rotate('y', '-30')
prepareImage(); Image(defaultImage)
# Excited state (charge: +2)
showPDB('td_stage3.pdb')
cmd.rotate('y', '-30')
prepareImage(); Image(defaultImage)
# Thymines (charge 0)
Как видно, при возбуждении системы (заряд +2) переход димера в тимины, как это ожидалось, не наблюдается. Повторим этот этап анализа с использованием другой параметризации – AM1
(вместо PM6
).
%%bash
# 2. Geometry optimization at +2
babel -ipdb td_stage2.pdb -omop td_stage2x.mop -xk "AM1"
sed -i 's/PM6/PM6 CHARGE=+2/' td_stage2x.mop
MOPAC2009.exe td_stage2x.mop
babel -imopout td_stage2x.out -opdb td_stage2x.pdb
showPDB('td_stage2x.pdb')
cmd.rotate('y', '-30')
prepareImage(); Image(defaultImage)
# Excited state (charge: +2); AM1 parameters
Таким образом, удалось увидеть переход из димера в тимины при возбуждении системы.
Сравним энергии молекул в каждом из состояний.
%%bash
for file in `echo td_stage*.out`; do
echo -ne $file"\t"
grep "TOTAL ENERGY" $file | awk '{print $4}';
done
Различие величин энергий для систем с зарядом +2 (стадии 2 и 2x) свидетельствует о значительном вкладе выбранной параметризации в значение общей энергии.