import re
import pybel
import subprocess, os
from IPython.display import Image
import pandas as pd
mol=pybel.readstring('smi','C1=CC2=CC3=CC=C(N3)C=C4C=CC(=N4)C=C5C=CC(=N5)C=C1N2')
mol.addh()
mol.make3D(steps=1000)
mol.write(format='pdb',filename='mol.pdb',overwrite=True)
mol
# for mopac
def creat_file (mol, file_name, param, charge):
mop = mol.write(format='mopin', filename='%s.mop' % file_name, opt={'k':'%s CHARGE=%s XYZ' % (param, charge)}, overwrite=True)
os.system("export MOPAC_LICENSE='/home/preps/golovin/progs/mopac/'")
os.system("echo | /home/preps/golovin/progs/mopac/MOPAC2016.exe %s.mop" % file_name)
# считаем геометрию
opt=pybel.readfile('mopout','%s.out' % file_name)
for i in opt:
i.write(format='pdb',filename='%s.pdb' % file_name, overwrite=True)
creat_file (mol, "mol_pm6", "PM6", mol.charge)
creat_file (mol, "mol_am1", "AM1", mol.charge)
Image(filename='mol.png')
Image(filename='mol_am1.png')
Image(filename='mol_pm6.png')
Выше представлены структуры порфирина, полученные pybel и двумя способами PM6 и AM1 в Mopac. Структура, полученная при помощи PM6 является наиболее корректной, потому что кольцо порфирина в ней плоское.
os.system("cp mol_pm6.mop mol_spectr.mop")
os.system('echo "" >> mol_spectr.mop')
os.system('echo "cis c.i.=4 meci oldgeo" >> mol_spectr.mop')
os.system('echo "some description" >> mol_spectr.mop')
os.system("export MOPAC_LICENSE='/home/preps/golovin/progs/mopac/'")
os.system("echo | /home/preps/golovin/progs/mopac/MOPAC2016.exe mol_spectr.mop")
f = open('mol_spectr.out', 'r')
lines = f.readlines()[1515:1523]
f.close()
energies = []
for line in lines:
energies.append(float(line.split()[1]))
print(energies)
На основании этих значений и простой формулы были расчитаны длины волн при которых происходят эти переходы.
wavelength = list(map(lambda energy: 1239.84193 / energy, energies))
print(wavelength)
creat_file (pybel.readfile("pdb", "td.pdb").next(), "td_charge_0", "PM6", 0)
creat_file (pybel.readfile("pdb", "td_charge_0.pdb").next(), "td_charge_2", "PM6", 2)
creat_file (pybel.readfile("pdb", "td_charge_2.pdb").next(), "td_charge_again_0", "PM6", 0)
%%bash
echo dimer
grep 'TOTAL ENERGY' td_charge_0.out
echo semi-dimer
grep 'TOTAL ENERGY' td_charge_2.out
echo two thymins
grep 'TOTAL ENERGY' td_charge_again_0.out
Тимидиновый димер
Image(filename='td.png')
Тимидиновый димер после оптимизации при заряде 0
Image(filename='td_charge_0.png')
Тимидиновый димер после оптимизации при заряде 2
Image(filename='td_charge_2.png')
Тимины после повторной оптимизации при заряде 0
Image(filename='td_charge_again_0.png')
При возбуждении системы тиминовый димер перешел в более энергетически невыгодную конформацию, которая стала переходным состоянием между тимининовым димером и двумя тиминами. Два тимина обладают немного меньшей энергией, по сравнению с тимидиновым димером, поэтому возбуждённое состояние при добавлении электронов не перешло обратно в исходно состояние.
Найдём оптимальную геометрию для нафталена и азулена и рассчитаем теплоты образования этих молекул разными подходами квантовой механики.
nap=pybel.readstring('smi','C1=CC=C2C=CC=CC2=C1')
nap.addh()
nap.make3D(steps=1000)
nap.write(format='pdb',filename='nap.pdb', overwrite=True)
nap
azu=pybel.readstring('smi','C1=CC=C2C=CC=C2C=C1')
azu.addh()
azu.make3D(steps=1000)
azu.write(format='pdb',filename='azu.pdb', overwrite=True)
azu
creat_file(nap, "nap_opt", "PM6", nap.charge)
creat_file(azu, "azu_opt", "PM6", azu.charge)
Оптимизируем с помощью MOPAC структуры нафталена и азулена
Нафталин до оптимизации
Image(filename='nap.png')
Нафталин после оптимизации
Image(filename='nap_opt.png')
Видно, что pybel с задачей построения нафталина не справился. А азулен после оптимизации практически не изменился.
Азулен до оптимизации
Image(filename='azu.png')
Азулен после оптимизации
Image(filename='azu_opt.png')
os.system('echo "C1=CC=C2C=CC=CC2=C1" > nap.smi')
os.system('obgen nap.smi > nap.mol')
nap = pybel.readfile('sdf', 'nap.mol').next()
nap.write(format='pdb',filename='nap_.pdb', overwrite=True)
nap
creat_file(nap, "nap_opt", "PM6", nap.charge)
Исправленный нафталин
Image(filename='nap_opt_new.png')
def orca(infile, file_name, param):
mol = pybel.readfile('pdb', '%s.pdb' % infile).next()
mol.write(format='orcainp',filename='nap.inp', overwrite=True)
orca = mol.write(format='orcainp',opt={'k': param}, overwrite=True)
orca_out = orca.replace('! insert inline commands here ', param)
outfile = open('%s.inp' % file_name, 'w')
outfile.write(orca_out)
outfile.close()
os.system('/srv/databases/orca/orca %s.inp | tee %s.log' % (file_name, file_name))
orca('nap_opt', 'nap_hf', '!HF RHF 6-31G')
orca('nap_opt', 'nap_dft', '!DFT RHF 6-31G')
orca('azu_opt', 'azu_hf', '!HF RHF 6-31G')
orca('azu_opt', 'azu_dft', '!DFT RHF 6-31G')
%%bash
grep "Total Energy" *.log
Image(filename='table.png')
Если из эксперимента известно, что энергия изомеризации нафталина в азулен составляет 35.3±2.2 kCal/mol, то метод DFT справился немного лучше, потому что значение, полученное с помощью этого метода, немного ближе к 35.3±2.2 kCal/mol. Однако, полученные значения довольно сильно отличются от экспериментальных, что ставит под сомнение корректность вывода.