Полуэмпирические и Ab initio вычисления молекулярных систем

Цель: Сравнение структуры порфирина полученные pybel и двумя способами PM6 и AM1 в Mopac

In [1]:
#загружаем модуль
import pybel
In [2]:
#Создадем соединение и сразу сделаем его 3D:
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)
In [3]:
mol.write(format='pdb',filename='pro_1.pdb',overwrite=True)

PM6 и AM1

In [4]:
import subprocess
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)
#Смотрим, как оно может записывать формат программы сэмиэмпирических расчётов MOPAC и записываем в файл
mop_pm6=mol.write(format='mopin',opt={'k':'PM6 CHARGE=%d' % mol.charge})
mop_pm6=mol.write(format='mopin',filename='pm6.mop',opt={'k':'PM6 CHARGE=%d' % mol.charge},overwrite=True)
print mop_pm6
mol.write(format='pdb',filename='pm6_before.pdb',overwrite=True)
# запускаем MOPAC
cmb1 = "export MOPAC_LICENSE='/home/preps/golovin/progs/mopac/'"
cmb2 = "/home/preps/golovin/progs/mopac/MOPAC2016.exe pm6.mop"
subprocess.call(cmb1, shell=True)
subprocess.call(cmb2, shell=True)
#Считаем геометрию
opt=pybel.readfile('mopout', 'pm6.out')
for i in opt:
    print i
    i.write(format='pdb',filename='pm6.pdb',overwrite=True)
None
c1cc2/C=c\3/cc/c(=C\C4=N/C(=C\c5ccc([n]5)/C=c/1\[nH]2)/C=C4)/[nH]3	pm6.out

In [5]:
import subprocess
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)
mop_am1=mol.write(format='mopin',opt={'k':'AM1 CHARGE=%d' % mol.charge})
mop_am1=mol.write(format='mopin',filename='am1.mop',opt={'k':'AM1 CHARGE=%d' % mol.charge},overwrite=True)
print mop_am1
mol.write(format='pdb',filename='am1_before.pdb',overwrite=True)

cmb1 = "export MOPAC_LICENSE='/home/preps/golovin/progs/mopac/'"
cmb2 = "/home/preps/golovin/progs/mopac/MOPAC2016.exe am1.mop"
subprocess.call(cmb1, shell=True)
subprocess.call(cmb2, shell=True)

opt=pybel.readfile('mopout', 'am1.out')
for i in opt:
    print i
    i.write(format='pdb',filename='am1.pdb',overwrite=True)
None
c1cc2/C=c\3/cc/c(=C\C4=N/C(=C\c5ccc([n]5)/C=c/1\[nH]2)/C=C4)/[nH]3	am1.out

In [6]:
from IPython.display import Image
Image(filename='all_done.png')
Out[6]:

На рисунке 1 изображена структура порфирина, полученная pybel, на рисунке 2 - AM1 и на рисунке 3 - PM6 Порфирин получается изогнутый, остальные методы подтверждают эту структуру.

Рассчитываем возбужденные состояния порфирина и на основе этих данных строим спектр поглощения молекулы.

In [7]:
%%bash

cp my.mop my_spectr.mop
echo "" >> my_spectr.mop
echo "cis c.i.=4 meci oldgeo" >> my_spectr.mop
echo "some description" >> my_spectr.mop

export MOPAC_LICENSE='/home/preps/golovin/progs/mopac/'
/home/preps/golovin/progs/mopac/MOPAC2016.exe my_spectr.mop
OMP: Error #34: System unable to allocate necessary resources for OMP thread:
OMP: System error #11: Resource temporarily unavailable
OMP: Hint: Try decreasing the value of OMP_NUM_THREADS.
forrtl: error (76): Abort trap signal
Image              PC                Routine            Line        Source             
libc.so.6          00007FD9ED7DB295  Unknown               Unknown  Unknown
libc.so.6          00007FD9ED7DE438  Unknown               Unknown  Unknown
libiomp5.so        00007FD9EDBB4126  Unknown               Unknown  Unknown
libiomp5.so        00007FD9EDB9F04C  Unknown               Unknown  Unknown
libiomp5.so        00007FD9EDBCE41C  Unknown               Unknown  Unknown
libiomp5.so        00007FD9EDBAC6D4  Unknown               Unknown  Unknown
libiomp5.so        00007FD9EDBAA77D  Unknown               Unknown  Unknown
libiomp5.so        00007FD9EDBA9726  Unknown               Unknown  Unknown
libiomp5.so        00007FD9EDB8B398  Unknown               Unknown  Unknown
MOPAC2016.exe      0000000000CC4B63  Unknown               Unknown  Unknown
MOPAC2016.exe      0000000000CA2A80  Unknown               Unknown  Unknown
MOPAC2016.exe      0000000000831EAD  Unknown               Unknown  Unknown
MOPAC2016.exe      0000000000807E0C  Unknown               Unknown  Unknown
MOPAC2016.exe      0000000000502519  Unknown               Unknown  Unknown
MOPAC2016.exe      00000000005E036A  Unknown               Unknown  Unknown
MOPAC2016.exe      000000000048B722  Unknown               Unknown  Unknown
MOPAC2016.exe      00000000005F00D6  Unknown               Unknown  Unknown
MOPAC2016.exe      0000000000746AD0  Unknown               Unknown  Unknown
MOPAC2016.exe      0000000000807B3E  Unknown               Unknown  Unknown
MOPAC2016.exe      0000000000403E9C  Unknown               Unknown  Unknown
libc.so.6          00007FD9ED7C7A55  Unknown               Unknown  Unknown
MOPAC2016.exe      0000000000403D89  Unknown               Unknown  Unknown
bash: line 8: 15080 Aborted                 /home/preps/golovin/progs/mopac/MOPAC2016.exe my_spectr.mop
In [8]:
opt=pybel.readfile('mopout','my_spectr.out')
for i in opt:
    print i
    i.write(format='pdb',filename='my_spectr.pdb',overwrite=True)
c1cc2/C=c\3/cc/c(=C/C4=N/C(=C\c5ccc([n]5)/C=c/1\[nH]2)/C=C4)/[nH]3	my_spectr.out

Получены значения энергий для электронных переходов

In [1]:
f = open('my_spectr.out', 'r')
lines = f.readlines()[-21:-13]

f.close()
energies = [float(line.split()[1]) for line in lines]
print energies
[1.770871, 2.174577, 2.329387, 2.699815, 3.097056, 3.15001, 3.756709, 3.765464]

На основании этих значений и простой формулы были рассчитаны длины волн и их частоты, при которых происходят эти переходы.

In [12]:
wavelengths = [1239.84193/e for e in energies]
frequencies = [e/4.135667516 for e in energies]
print 'frequncy,THz\t wavelength,nm\tenergy,eV'
for i in range(len(energies)):
        print '%.4f \t %.4f \t %.4f' % (frequencies[i]*1000, wavelengths[i], energies[i])
frequncy,THz	 wavelength,nm	energy,eV
36995.2370 	 8.1035 	 153.0000
37237.0360 	 8.0509 	 154.0000
37478.8349 	 7.9990 	 155.0000
37720.6338 	 7.9477 	 156.0000
37962.4328 	 7.8971 	 157.0000
38204.2317 	 7.8471 	 158.0000
38446.0306 	 7.7977 	 159.0000
38687.8296 	 7.7490 	 160.0000