You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1318 lines
52 KiB
1318 lines
52 KiB
#!/usr/bin/env python3 |
|
import os |
|
import sys |
|
import argparse |
|
import re |
|
from matplotlib import colors |
|
import numpy as np |
|
import matplotlib.pyplot as plt |
|
import matplotlib |
|
from prettytable import PrettyTable |
|
matplotlib.use('PS') |
|
#matplotlib.rc('text', usetex=True) |
|
#matplotlib.use('Qt5agg') |
|
from cmmde_msd_com import msd_com, msd_fit |
|
from cmmde_rdf import rdf |
|
from cmmde_dock import checkopt |
|
|
|
parser = argparse.ArgumentParser(description='Program Analisis Hasil Perhitungan Dalam MOWS CMMD 2021') |
|
parser.add_argument('-j','--job',type=str,default='None',help='Jenis perhitungan yang dilakukan. Pilihan: sp, opt, thermo, ir, reax, msd_com, msd, msd_fit rdf, td.') |
|
parser.add_argument('-m', '--method', type=str, default='XTB2', help='Metode yang digunakan dalam perhitungan.') |
|
parser.add_argument('-i','--input',type=str,default='geom.xyz',help='Koordinat awal dalam format .xyz (hanya diperlukan untuk program DCDFTBMD) saat optimasi geometri.') |
|
parser.add_argument('-s', '--software', type=str, default='orca',help='Jenis software yang digunakan. Pilihan: orca, dcdftb, dftb+.') |
|
parser.add_argument('-irx','--inputreaction',type=str, default='None', help='Input reaksi kimia') |
|
parser.add_argument('-t','--temp',type=float,default=298.15, help='Suhu yang digunakan dalam perhitungan frekuensi dan termokimia') |
|
parser.add_argument('-traj','--traject',type=str,default='traject.xyz',help='File trayektori dinamika molekul dalam format .xyz') |
|
parser.add_argument('-l', '--latt', type=str, default='cmmd.in', help='Ukuran rusuk sel satuan.') |
|
parser.add_argument('-start', '--start', type=int, default=0, help='Titik acuan dalam bilangan bulat. Default = 0.') |
|
parser.add_argument('-end','--end', type=int, default=-1, help='Titik ahir pembacaan trayektori') |
|
parser.add_argument('-msd','--msd',type=str, default='msd.out', help='File berisikan MSD keluaran cmmdepost.py -j msdcom.') |
|
parser.add_argument('-dt','--dt',type=float,default=0.5, help='Time step yang didefinisikan selama simulasi berlangsung.') |
|
parser.add_argument('-n', '--noheader', action="store_true",help='Mendefinisikan apakah file mengandung header atau tidak. Default file msd.out mengandung header berupa #.') |
|
parser.add_argument('-g', '--groups', type=str, help='Molekul didefinisikan dengan Nama*JumlahAtom*JumlahMolekul. Contoh NAP*1*2:DMF*1*20.') |
|
parser.add_argument('-r', '--range', default=10.0, type=float,help='Jarak terjauh pengukuran RDF') |
|
parser.add_argument('-p', '--pair', type=str, help='Pasangan atom, misalnya "O-O" untuk pasangan atom O-O') |
|
parser.add_argument('-res','--resolution',default=0.01, type=float, help='Resolusi untuk plot histogram atau RDF') |
|
# Metadinamika |
|
parser.add_argument('-metafreq','--metafreq',type=int,default=100, help='Dalam berapa step sekali potensial Gaussian ditambahkan?') |
|
parser.add_argument('-fesstart','--fesstart',type=float,default=0, help='Titik minimum CV. Default = 0.') |
|
parser.add_argument('-fesend','--fesend',type=float,default=1, help='Titik maksimum CV. Default = 1.') |
|
parser.add_argument('-fesbin','--fesbin',type=float,default=0.01,help='Selang CV. Default = 0.01') |
|
parser.add_argument('-cv','--cvtype',type=str,default='coordnum',help='Pilihan collective variable (CV) yang digunakan. Pilihan: coordnum, distance, angle, dihedral, distancediff, distanceadd, meandistance, pointplanedistance.') |
|
parser.add_argument('-ngaus','--ngaus',type=int,help='Jumlah Gaussian yang didepositkan') |
|
parser.add_argument('-nlig','--nligands',type=int,help='Jumlah ligan yang akan didocking.') |
|
parser.add_argument('-nr','--nroots',type=int,default=5,help='Jumlah keadaan tereksitasi.') |
|
parser.add_argument('-pts','--points',type=int,default=300,help='Jumlah titik untuk plot UV.') |
|
# Analisis DOS |
|
parser.add_argument('-pdos','--pdos',type=str,help='File DOS parsial hasil perhitungan DFTB+') |
|
parser.add_argument('-xlabel','--xlabel',type=str,default='x',help='Label sumbu-x dalam sebuah plot') |
|
parser.add_argument('-ylabel','--ylabel',type=str,default='y',help='Label sumbu-y dalam sebuah plot') |
|
parser.add_argument('-file','--file',type=str,help='Nama file yang akan diplot') |
|
parser.add_argument('-np','--nproc',type=int,default=1,help='Jumlah prosesor yang digunakan.') |
|
parser.add_argument('-grid','--grid',type=str,default='FINE',help='Jenis grid yang akan dibangun untuk perhitungan NCI. Pilihan: FINE (default), COARSE, dan ULTRAFINE.') |
|
# Analisis terkait perhitungan Quantum Espresso |
|
parser.add_argument('-outdir','--outdir',type=str,default='./out',help='Folder tempat menyimpan output.') |
|
parser.add_argument('-emin','--emin',type=float,default=-9.0,help='Batas minimum nilai keadaan elektronik pada DOS.') |
|
parser.add_argument('-emax','--emax',type=float,default=16.0,help='Batas maksimum nilai keadaan elektronik pada DOS.') |
|
|
|
opt = parser.parse_args(sys.argv[1:]) |
|
|
|
# Berbagai faktor konversi |
|
Ha2kcal = 627.5096080305927 |
|
ev2kcal = 23.060541945329334 |
|
Ha2kj = 2625.5 |
|
ev2kj = 96 |
|
# Analisis Output |
|
method = opt.method |
|
if opt.job == 'sp' and opt.software == 'orca' and not (opt.method == 'XTB' or opt.method == 'XTB2'): |
|
if os.path.isfile('cmmd.out'): |
|
with open('cmmd.out','r') as f: |
|
for line in f: |
|
if "Total Energy" in line: |
|
arr= line.split() |
|
Energy = float(arr[3]) |
|
|
|
print('Energi total molekul: {} Hartree = {:.2f} kJ/mol'.format(Energy,Energy*Ha2kj)) |
|
else: |
|
print("Mohon menunggu hingga perhitungan anda selesai.") |
|
exit |
|
|
|
elif opt.job == 'sp' and opt.software == 'orca': |
|
if os.path.isfile('cmmd.out'): |
|
with open('cmmd.out','r') as f: |
|
for line in f: |
|
if "TOTAL ENERGY" in line: |
|
arr= line.split() |
|
Energy = float(arr[3]) |
|
if "GRADIENT NORM" in line: |
|
arr = line.split() |
|
Gradient = float(arr[3]) |
|
if "HOMO-LUMO GAP" in line: |
|
arr = line.split() |
|
Egap = float(arr[3]) |
|
|
|
print('Energi total molekul: {} Hartree = {:.2f} kJ/mol'.format(Energy,Energy*Ha2kj)) |
|
print('Norm Gradien: {} Hartree/a0 = {:.2f} kJ/mol/a0'.format(Gradient,Gradient*Ha2kj)) |
|
print('HOMO-LUMO gap: {:.2f} eV = {:.2f} kJ/mol'.format(Egap,Egap*ev2kj)) |
|
else: |
|
print("Mohon menunggu hingga perhitungan anda selesai.") |
|
exit |
|
|
|
if opt.job == 'opt' and opt.software == 'orca': |
|
Energy = [] |
|
Gradient = [] |
|
TotalEnergy = [] |
|
if os.path.isfile('cmmd.out'): |
|
with open('cmmd.out','r') as f: |
|
for line in f: |
|
if "Current Energy" in line: |
|
arr = line.split() |
|
Energy.append(float(arr[3])) |
|
if "Current gradient" in line: |
|
arr = line.split() |
|
Gradient.append(float(arr[4])) |
|
if "FINAL SINGLE POINT ENERGY" in line: |
|
arr = line.split() |
|
TotalEnergy.append(float(arr[4])) |
|
Optstep = range(0,len(Energy)) |
|
print("Total energi elektronik = {} Hartree = {} kJ/mol".format(TotalEnergy[-1],TotalEnergy[-1]*Ha2kj)) |
|
if method != "XTB1" and method != "xtb1" and method != "XTB2" and method != "xtb2" and method != "XTB" and method != "xtb": |
|
with open('cmmd.out','r') as f: |
|
lines = f.readlines() |
|
occ = [] |
|
energy = [] |
|
for index,line in enumerate(lines): |
|
if 'Basis Dimension' in line: |
|
arr = line.split() |
|
NBas = int(arr[4]) |
|
if 'ORBITAL ENERGIES' in line: |
|
for i in range(NBas): |
|
arr = lines[index+i+4].split() |
|
occ.append(arr[1]) |
|
energy.append(float(arr[3])) |
|
Eocc = [] |
|
Evir = [] |
|
for energy in energy: |
|
if energy > 0: |
|
Evir.append(energy) |
|
if energy < 0: |
|
Eocc.append(energy) |
|
E_HOMO = max(Eocc) |
|
E_LUMO = min(Evir) |
|
print('######INFORMASI ENERGI HOMO & LUMO######') |
|
print('Energi HOMO = {:.2f} eV'.format(E_HOMO)) |
|
print('Energi LUMO = {:.2f} eV'.format(E_LUMO)) |
|
print('Gap HOMO-LUMO = {:.2f} eV'.format(E_LUMO-E_HOMO)) |
|
else: |
|
Gaps = [] |
|
with open("cmmd.out", 'r') as f: |
|
print('######INFORMASI ENERGI HOMO & LUMO######') |
|
for line in f: |
|
if "GAP" in line: |
|
arr = line.split() |
|
Gaps.append(float(arr[3])) |
|
print("Gap HOMO-LUMO = {:.2f} eV".format(Gaps[-1])) |
|
|
|
with open('optimized.dat','w') as fout: |
|
print("#Step Energy Gradient", file=fout) |
|
for optstep,energy,gradient in zip(Optstep,Energy,Gradient): |
|
print("{} {} {}".format(optstep,energy,gradient),file=fout) |
|
|
|
## Plotting |
|
with open('optimized.gp','w') as fout: |
|
print("""set terminal pdf |
|
set output "optimized.pdf" |
|
set title "Energy Vs. Optimization Step" |
|
set xlabel "Optimization Step" |
|
set xtics 1 |
|
set ylabel "Energy [Hartree]" |
|
set style line 1 \\ |
|
linecolor rgb '#0060ad' \\ |
|
linetype 1 linewidth 2 \\ |
|
pointtype 7 pointsize 1.5 |
|
|
|
plot 'optimized.dat' using 1:2 notitle with linespoints linestyle 1""",file=fout) |
|
|
|
os.system('gnuplot optimized.gp') |
|
else: |
|
print("Mohon menunggu hingga perhitungan anda selesai.") |
|
exit |
|
|
|
if opt.job == 'ir' and opt.software == 'orca': |
|
def gaussband(x,band,strength,stdev): |
|
bandshape=1.3062974e8 * (strength / (1e7/stdev)) * np.exp(-(((1.0/x)-(1.0/band))/(1.0/stdev))**2) |
|
return bandshape |
|
|
|
Freq = [] |
|
Int = [] |
|
NFreq = 0 |
|
if os.path.isfile('cmmd.out'): |
|
with open('cmmd.out','r') as f: |
|
lines = f.readlines() |
|
|
|
for index,line in enumerate(lines): |
|
if "The total number of vibrations considered is" in line: |
|
arr = line.split() |
|
NFreq += int(arr[7]) |
|
for index,line in enumerate(lines): |
|
if "Total enthalpy" in line: |
|
arr = line.split() |
|
Enthalpy = float(arr[3]) |
|
if "Final Gibbs free energy" in line: |
|
arr = line.split() |
|
Gibbs = float(arr[5]) |
|
# if "Total entropy" in line: |
|
# arr = line.split() |
|
# Entropy = float(arr[4]) |
|
if "IR SPECTRUM" in line: |
|
for i in range(NFreq): |
|
arr = lines[index+6+i].split() |
|
Freq.append(float(arr[1])) |
|
Int.append(float(arr[2])) |
|
x = np.linspace(500,4000,5000) |
|
composite = 0 |
|
for count,peak in enumerate(Freq): |
|
thispeak = gaussband(x,peak,Int[count],1e5) |
|
composite+=thispeak |
|
|
|
fig,ax = plt.subplots() |
|
ax.plot(x,composite,color='blue') |
|
ax.tick_params(direction='in') |
|
plt.grid(linestyle=':') |
|
plt.xlim(500,4000) |
|
plt.ylim(0,) |
|
plt.xlabel('Wavenumbers [cm$^{-1}$]') |
|
plt.ylabel('Absorbance') |
|
plt.savefig('IR.pdf',dpi=1200,format='pdf') |
|
|
|
with open('IR_fit.dat','w') as fout: |
|
for x,y in zip(x,composite): |
|
print(x,y,file=fout) |
|
|
|
else: |
|
print("Mohon menunggu hingga perhitungan anda selesai.") |
|
exit |
|
|
|
if opt.job == 'thermo' and opt.software == 'orca': |
|
|
|
if os.path.isfile('cmmd.out'): |
|
with open('cmmd.out','r') as f: |
|
for line in f: |
|
if "Total enthalpy" in line: |
|
arr = line.split() |
|
Enthalpy = float(arr[3]) |
|
if "Final Gibbs free energy" in line: |
|
arr = line.split() |
|
Gibbs = float(arr[5]) |
|
# if "Total entropy" in line: |
|
# arr = line.split() |
|
# Entropy = float(arr[4]) |
|
if "Non-thermal (ZPE)" in line: |
|
arr = line.split() |
|
ZPE = float(arr[3]) |
|
if "Electronic energy" in line: |
|
arr = line.split() |
|
E_elec = float(arr[3]) |
|
if "Thermal vibrational correction" in line: |
|
arr = line.split() |
|
Evib = float(arr[4]) |
|
if "Thermal rotational correction" in line: |
|
arr = line.split() |
|
Erot = float(arr[4]) |
|
if "Thermal translational correction" in line: |
|
arr = line.split() |
|
Etrans = float(arr[4]) |
|
if opt.method == 'XTB2' or opt.method == 'XTB': |
|
E_HOMO = 0 |
|
E_LUMO = 0 |
|
with open('cmmd.out','r') as f: |
|
for line in f: |
|
if '(HOMO)' in line: |
|
arr = line.split() |
|
E_HOMO += float(arr[3]) |
|
if "(LUMO)" in line: |
|
arr = line.split() |
|
E_LUMO += float(arr[2]) |
|
print('######INFORMASI ENERGI HOMO & LUMO######') |
|
print('Energi HOMO = {:.2f} eV'.format(E_HOMO)) |
|
print('Energi LUMO = {:.2f} eV'.format(E_LUMO)) |
|
print('Gap HOMO-LUMO = {:.2f} eV'.format(E_LUMO-E_HOMO)) |
|
print('') |
|
|
|
else: |
|
with open('cmmd.out','r') as f: |
|
lines = f.readlines() |
|
occ = [] |
|
energy = [] |
|
for index,line in enumerate(lines): |
|
if 'Basis Dimension' in line: |
|
arr = line.split() |
|
NBas = int(arr[4]) |
|
if 'ORBITAL ENERGIES' in line: |
|
for i in range(NBas): |
|
arr = lines[index+i+4].split() |
|
occ.append(arr[1]) |
|
energy.append(float(arr[3])) |
|
Eocc = [] |
|
Evir = [] |
|
for energy in energy: |
|
if energy > 0: |
|
Evir.append(energy) |
|
if energy < 0: |
|
Eocc.append(energy) |
|
E_HOMO = max(Eocc) |
|
E_LUMO = min(Evir) |
|
print('######INFORMASI ENERGI HOMO & LUMO######') |
|
print('Energi HOMO = {:.2f} eV'.format(E_HOMO)) |
|
print('Energi LUMO = {:.2f} eV'.format(E_LUMO)) |
|
print('Gap HOMO-LUMO = {:.2f} eV'.format(E_LUMO-E_HOMO)) |
|
print('') |
|
|
|
|
|
print('######INFORMASI ENERGI ELEKTRONIK & KOREKSI TERMAL######') |
|
print("Energi elektronik = {} Hartree = {} kJ/mol".format(E_elec,E_elec*Ha2kj)) |
|
print("Zero point energy (ZPE) = {} Hartree = {} kJ/mol".format(ZPE,ZPE*Ha2kj)) |
|
print("Koreksi termal vibrasi = {} Hartree = {} kJ/mol".format(Evib,Evib*Ha2kj)) |
|
print("Koreksi termal rotasi = {} Hartree = {} kJ/mol".format(Erot,Erot*Ha2kj)) |
|
print("Koreksi termal translasi = {} Hartree = {} kJ/mol".format(Etrans,Etrans*Ha2kj)) |
|
print('Total koreksi termal = {} Hartree = {} kJ/mol'.format(Etrans+Evib+Erot,(Etrans+Evib+Erot)*Ha2kj)) |
|
print('') |
|
print('######INFORMASI BESARAN TERMOKIMIA######') |
|
print("Entalpi (H) = {} Hartree = {} kj/mol".format(Enthalpy,Enthalpy*Ha2kj)) |
|
# print("Entropi (S) = {} Hartree/K = {} J/(mol K)".format(Entropy/Temperature,Entropy*Ha2kj/Temperature*1000)) |
|
print("Energi bebas Gibbs (G) = {} Hartree = {} kJ/mol".format(Gibbs,Gibbs*Ha2kj)) |
|
|
|
else: |
|
print("Mohon menunggu hingga perhitungan anda selesai.") |
|
exit |
|
|
|
### Opsi untuk print hanya HOMO-LUMO energi |
|
if opt.job == 'gap' and ('XTB' not in opt.method and 'XTB2' not in opt.method) and opt.software == 'orca': |
|
with open('cmmd.out','r') as f: |
|
lines = f.readlines() |
|
occ = [] |
|
energy = [] |
|
for index,line in enumerate(lines): |
|
if 'Basis Dimension' in line: |
|
arr = line.split() |
|
NBas = int(arr[4]) |
|
if 'ORBITAL ENERGIES' in line: |
|
for i in range(NBas): |
|
arr = lines[index+i+4].split() |
|
occ.append(arr[1]) |
|
energy.append(float(arr[3])) |
|
Eocc = [] |
|
Evir = [] |
|
for energy in energy: |
|
if energy > 0: |
|
Evir.append(energy) |
|
if energy < 0: |
|
Eocc.append(energy) |
|
E_HOMO = max(Eocc) |
|
E_LUMO = min(Evir) |
|
print('######INFORMASI ENERGI HOMO & LUMO######') |
|
print('Energi HOMO = {:.2f} eV'.format(E_HOMO)) |
|
print('Energi LUMO = {:.2f} eV'.format(E_LUMO)) |
|
print('Gap HOMO-LUMO = {:.2f} eV'.format(E_LUMO-E_HOMO)) |
|
if opt.job == 'gap' and ('XTB' in opt.method or 'XTB2' in opt.method) and opt.software == 'orca': |
|
E_HOMO = [] |
|
E_LUMO = [] |
|
with open('cmmd.out','r') as f: |
|
for line in f: |
|
if '(HOMO)' in line: |
|
arr = line.split() |
|
E_HOMO.append(float(arr[3])) |
|
if '(LUMO)' in line: |
|
arr = line.split() |
|
E_LUMO.append(float(arr[2])) |
|
E_gap = E_LUMO[-1] - E_HOMO[-1] |
|
print('######INFORMASI ENERGI HOMO & LUMO######') |
|
print('Energi HOMO = {:.2f} eV'.format(E_HOMO[-1])) |
|
print('Energi LUMO = {:.2f} eV'.format(E_LUMO[-1])) |
|
print('Gap HOMO-LUMO = {:.2f} eV'.format(E_gap)) |
|
|
|
if opt.job == 'td' and opt.software == 'orca': |
|
with open('cmmd.out','r') as f: |
|
lines = f.readlines() |
|
occ = [] |
|
energy = [] |
|
for index,line in enumerate(lines): |
|
if 'Basis Dimension' in line: |
|
arr = line.split() |
|
NBas = int(arr[4]) |
|
if 'ORBITAL ENERGIES' in line: |
|
for i in range(NBas): |
|
arr = lines[index+i+4].split() |
|
occ.append(arr[1]) |
|
energy.append(float(arr[3])) |
|
Eocc = [] |
|
Evir = [] |
|
for energy in energy: |
|
if energy > 0: |
|
Evir.append(energy) |
|
if energy < 0: |
|
Eocc.append(energy) |
|
E_HOMO = max(Eocc) |
|
E_LUMO = min(Evir) |
|
print('######INFORMASI ENERGI HOMO & LUMO######') |
|
print('Energi HOMO = {:.2f} eV'.format(E_HOMO)) |
|
print('Energi LUMO = {:.2f} eV'.format(E_LUMO)) |
|
print('Gap HOMO-LUMO = {:.2f} eV'.format(E_LUMO-E_HOMO)) |
|
|
|
|
|
# A sqrt(2) * standard deviation of 0.4 eV is 3099.6 nm. 0.1 eV is 12398.4 nm. 0.2 eV is 6199.2 nm. |
|
stdev = 4132.806433333334 |
|
# For Lorentzians, gamma is half bandwidth at half peak height (nm) |
|
gamma = 12.5 |
|
# Excitation energies dalam nm |
|
#bands = [330,328,328,308,290,290,288,283,276,270,268] |
|
bands = [] |
|
fosc = [] |
|
with open("cmmd.out", 'r') as f: |
|
for line in f: |
|
if 'ABSORPTION SPECTRUM VIA TRANSITION ELECTRIC DIPOLE MOMENTS' in line: |
|
next(f) |
|
next(f) |
|
next(f) |
|
next(f) |
|
for i in range(opt.nroots): |
|
arr = next(f).split() |
|
bands.append(float(arr[2])) |
|
fosc.append(float(arr[3])) |
|
|
|
#f = [7.90e-7,0.00,7.16e-4,1.02e-2,1.38e-6,2.94e-7,0.00,8.86e-4,1.54e-5,1.25e-2,9.31e-3] |
|
if len(bands) != len(fosc): |
|
print('Jumlah panjang gelombang tidak sama dengan jumlah oscillator strength') |
|
sys.exit() |
|
|
|
def KurvaGaussian(x, band, strength, stdev): |
|
"Memproduksi kurva Gaussian" |
|
bandshape = 1.3062974e8 * (strength / (1e7/stdev)) * np.exp(-(((1.0/x)-(1.0/band))/(1.0/stdev))**2) |
|
# Definisi di atas diambil dari P. J. Stephens, N. Harada, Chirality 22, 229 (2010) |
|
return bandshape |
|
|
|
def lorentzBand(x, band, strength, stdev, gamma): |
|
"Memproduksi kurva Lorentzian" |
|
bandshape= 1.3062974e8 * (strength / (1e7/stdev)) * ((gamma**2)/((x - band)**2 + gamma**2)) |
|
return bandshape |
|
|
|
x = np.linspace(opt.start, opt.end, opt.points) |
|
|
|
composite = 0 |
|
for count, peak in enumerate(bands): |
|
PuncakIni = KurvaGaussian(x, peak, fosc[count], stdev) |
|
composite += PuncakIni |
|
|
|
composite = np.array(composite) |
|
|
|
fig,ax = plt.subplots() |
|
ax.plot(x, composite,color='blue') |
|
plt.xlim(opt.start,opt.end) |
|
plt.xlabel('$\lambda$ [nm]') |
|
plt.ylabel('$\epsilon$ [L mol$^{-1}$cm$^{-1}$]') |
|
# plt.ticklabel_format(style="sci",scilimits=(0,0)) |
|
plt.savefig('plot_uv.pdf') |
|
|
|
if opt.job == 'td' and opt.software == 'dcdftb': |
|
nroots = 0 |
|
with open('cmmd.out','r') as f: |
|
for line in f: |
|
if 'Excitation Energy' in line: |
|
arr = line.split() |
|
print("Gap HOMO-LUMO = {:.2f} eV".format(float(arr[3])*27.2114)) |
|
from scipy.constants import h, c |
|
wavelength = h*c/(float(arr[3])*4.35974e-18)*1e9 |
|
print("Panjang gelombang serapan = {:.0f} nm".format(wavelength)) |
|
if 'Number of states' in line: |
|
arr = line.split() |
|
nroots+=int(arr[4]) |
|
print('Jumlah keadaan tereksitasi = {}'.format(nroots)) |
|
|
|
# A sqrt(2) * standard deviation of 0.4 eV is 3099.6 nm. 0.1 eV is 12398.4 nm. 0.2 eV is 6199.2 nm. |
|
stdev = 4132.806433333334 |
|
# For Lorentzians, gamma is half bandwidth at half peak height (nm) |
|
gamma = 12.5 |
|
# Excitation energies dalam nm |
|
#bands = [330,328,328,308,290,290,288,283,276,270,268] |
|
bands = [] |
|
fosc = [] |
|
with open("cmmd.out", 'r') as f: |
|
for line in f: |
|
if 'Energies' in line: |
|
next(f) |
|
next(f) |
|
next(f) |
|
for i in range(nroots): |
|
arr = next(f).split() |
|
bands.append(float(arr[1])) |
|
if 'Strength' in line: |
|
next(f) |
|
for i in range(nroots): |
|
arr = next(f).split() |
|
fosc.append(float(arr[1])) |
|
#f = [7.90e-7,0.00,7.16e-4,1.02e-2,1.38e-6,2.94e-7,0.00,8.86e-4,1.54e-5,1.25e-2,9.31e-3] |
|
eVtoJoule = 1.60218e-19 |
|
bands = np.array(bands) |
|
from scipy.constants import h,c |
|
bands = h*c/(bands*eVtoJoule)*1e9 |
|
if len(bands) != len(fosc): |
|
print('Jumlah panjang gelombang tidak sama dengan jumlah oscillator strength') |
|
sys.exit() |
|
|
|
def KurvaGaussian(x, band, strength, stdev): |
|
"Memproduksi kurva Gaussian" |
|
bandshape = 1.3062974e8 * (strength / (1e7/stdev)) * np.exp(-(((1.0/x)-(1.0/band))/(1.0/stdev))**2) |
|
# Definisi di atas diambil dari P. J. Stephens, N. Harada, Chirality 22, 229 (2010) |
|
return bandshape |
|
|
|
def lorentzBand(x, band, strength, stdev, gamma): |
|
"Memproduksi kurva Lorentzian" |
|
bandshape= 1.3062974e8 * (strength / (1e7/stdev)) * ((gamma**2)/((x - band)**2 + gamma**2)) |
|
return bandshape |
|
|
|
x = np.linspace(opt.start, opt.end, opt.points) |
|
|
|
composite = 0 |
|
for count, peak in enumerate(bands): |
|
PuncakIni = KurvaGaussian(x, peak, fosc[count], stdev) |
|
composite += PuncakIni |
|
|
|
composite = np.array(composite) |
|
|
|
with open("uv.dat",'w') as f: |
|
for i, j in zip(x,composite): |
|
print(i,j,file=f) |
|
|
|
fig,ax = plt.subplots() |
|
ax.plot(x, composite,color='blue') |
|
plt.xlim(opt.start,opt.end) |
|
plt.ylim(0,) |
|
plt.xlabel('$\lambda$ [nm]') |
|
plt.ylabel('$\epsilon$ [L mol$^{-1}$cm$^{-1}$]') |
|
plt.ticklabel_format(style="sci",scilimits=(0,3)) |
|
plt.savefig('plot_uv.pdf') |
|
|
|
if opt.job == 'msdcom': |
|
msd_com(opt.groups,opt.traject,opt.start,opt.latt,opt.dt) |
|
|
|
if opt.job == 'msdfit': |
|
msd_fit(opt.msd, opt.noheader,opt.start) |
|
|
|
if opt.job == 'reax' or opt.inputreaction != 'None': |
|
Input = opt.inputreaction |
|
Reaksi = Input.split('->') |
|
Reaktan = Reaksi[0] |
|
Reaktan = Reaktan.split('+') |
|
|
|
KoefisienReaktan = [] |
|
reak = [] |
|
for i in Reaktan: |
|
coeff = re.split(r"(\d+)", i) |
|
KoefisienReaktan.append(coeff[1]) |
|
reak.append("".join(coeff[2:])) |
|
KoefisienReaktan = [-int(i) for i in KoefisienReaktan] |
|
Reaktan = reak |
|
Produk = Reaksi[1] |
|
Produk = Produk.split('+') |
|
KoefisienProduk = [] |
|
prod = [] |
|
for i in Produk: |
|
coeff = re.split(r"(\d+)", i) |
|
KoefisienProduk.append(coeff[1]) |
|
prod.append("".join(coeff[2:])) |
|
KoefisienProduk = [int(i) for i in KoefisienProduk] |
|
Produk = prod |
|
E_reaktan = [] |
|
zpe_reaktan = [] |
|
E_cor_reaktan = [] |
|
H_cor_reaktan = [] |
|
G_cor_reaktan = [] |
|
E_produk = [] |
|
zpe_produk = [] |
|
E_cor_produk = [] |
|
H_cor_produk = [] |
|
G_cor_produk = [] |
|
H_reaktan = [] |
|
G_reaktan = [] |
|
H_produk = [] |
|
G_produk = [] |
|
for i in Reaktan: |
|
with open('{}/cmmd.out'.format(i),'r') as f: |
|
if opt.software == 'orca': |
|
for line in f: |
|
if "Total enthalpy" in line: |
|
arr = line.split() |
|
H_reaktan.append(float(arr[3])) |
|
if "Final Gibbs free energy" in line: |
|
arr = line.split() |
|
G_reaktan.append(float(arr[5])) |
|
if "Total thermal energy" in line: |
|
arr = line.split() |
|
E_reaktan.append(float(arr[3])) |
|
if opt.software == 'dcdftb': |
|
temp_ener = [] |
|
for line in f: |
|
if "Final" in line and "Energy" in line: |
|
arr = line.split() |
|
temp_ener.append(float(arr[4])) |
|
if "Zero" in line: |
|
arr = line.split() |
|
zpe_reaktan.append(float(arr[4])) |
|
if "Thermal correction to energy" in line: |
|
arr = line.split() |
|
E_cor_reaktan.append(float(arr[5])) |
|
if "Thermal correction to enthalpy" in line: |
|
arr = line.split() |
|
H_cor_reaktan.append(float(arr[5])) |
|
if "Thermal correction to Gibbs free energy" in line: |
|
arr = line.split() |
|
G_cor_reaktan.append(float(arr[7])) |
|
E_reaktan.append(temp_ener[-1]) |
|
|
|
|
|
for i in Produk: |
|
with open('{}/cmmd.out'.format(i),'r') as f: |
|
if opt.software == 'orca': |
|
for line in f: |
|
if "Total enthalpy" in line: |
|
arr = line.split() |
|
H_produk.append(float(arr[3])) |
|
if "Final Gibbs free energy" in line: |
|
arr = line.split() |
|
G_produk.append(float(arr[5])) |
|
if "Total thermal energy" in line: |
|
arr = line.split() |
|
E_produk.append(float(arr[3])) |
|
if opt.software == 'dcdftb': |
|
temp_ener = [] |
|
for line in f: |
|
if "Final" in line and "Energy" in line: |
|
arr = line.split() |
|
temp_ener.append(float(arr[4])) |
|
if "Zero" in line: |
|
arr = line.split() |
|
zpe_produk.append(float(arr[4])) |
|
if "Thermal correction to energy" in line: |
|
arr = line.split() |
|
E_cor_produk.append(float(arr[5])) |
|
if "Thermal correction to enthalpy" in line: |
|
arr = line.split() |
|
H_cor_produk.append(float(arr[5])) |
|
if "Thermal correction to Gibbs free energy" in line: |
|
arr = line.split() |
|
G_cor_produk.append(float(arr[7])) |
|
E_produk.append(temp_ener[-1]) |
|
|
|
Koefisien = KoefisienReaktan + KoefisienProduk |
|
Koefisien = np.array(Koefisien,dtype=int) |
|
|
|
if opt.software == 'orca': |
|
H = H_reaktan + H_produk |
|
H = np.array(H,dtype=float) |
|
delta_H = (np.dot(H,Koefisien))*Ha2kj |
|
E = E_reaktan + E_produk |
|
E = np.array(E,dtype=float) |
|
delta_E = (np.dot(E,Koefisien))*Ha2kj |
|
print('Delta_E = {:.2f} kJ/mol'.format(delta_E)) |
|
print('Delta_H = {:.2f} kJ/mol'.format(delta_H)) |
|
G = G_reaktan + G_produk |
|
G = np.array(G,dtype=float) |
|
delta_G = (np.dot(G,Koefisien))*Ha2kj |
|
print('Delta_G = {:.2f} kJ/mol'.format(delta_G)) |
|
delta_S = (delta_H - delta_G)/opt.temp*1000 |
|
print('Delta_S = {:.2f} J/(mol K)'.format(delta_S)) |
|
if opt.software == 'dcdftb': |
|
E = np.array(E_reaktan + E_produk, dtype=float) |
|
|
|
E_cor = np.array(E_cor_reaktan + E_cor_produk, dtype=float) |
|
H_cor = np.array(H_cor_reaktan + H_cor_produk, dtype=float) |
|
G_cor = np.array(G_cor_reaktan + G_cor_produk, dtype=float) |
|
zpe = np.array(zpe_reaktan + zpe_produk, dtype=float) |
|
delta_zpe = (np.dot(zpe,Koefisien))*Ha2kj |
|
delta_El = (np.dot(E,Koefisien))*Ha2kj |
|
delta_Ecor = (np.dot(E_cor,Koefisien))*Ha2kj |
|
|
|
delta_Hcor = (np.dot(H_cor,Koefisien))*Ha2kj |
|
delta_Gcor = (np.dot(G_cor,Koefisien))*Ha2kj |
|
delta_E = delta_El + delta_zpe + delta_Ecor |
|
delta_H = delta_El + delta_zpe + delta_Hcor |
|
delta_G = delta_El + delta_zpe + delta_Gcor |
|
|
|
print('Delta_E = {:.2f} kJ/mol'.format(delta_E)) |
|
print('Delta_H = {:.2f} kJ/mol'.format(delta_H)) |
|
print('Delta_G = {:.2f} kJ/mol'.format(delta_G)) |
|
delta_S = (delta_H - delta_G)/opt.temp*1000 |
|
print('Delta_S = {:.2f} J/(mol K)'.format(delta_S)) |
|
|
|
if opt.job == 'ts' and opt.software == 'orca': |
|
Input = opt.inputreaction |
|
Reaksi = Input.split('->') |
|
Reaktan = Reaksi[0] |
|
Reaktan = Reaktan.split('+') |
|
KoefisienReaktan = [i[0] for i in Reaktan] |
|
KoefisienReaktan = [-int(i) for i in KoefisienReaktan] |
|
Reaktan = [i[1:] for i in Reaktan] |
|
TS = Reaksi[1] |
|
TS = TS.split('+') |
|
KoefisienTS = [i[0] for i in TS] |
|
KoefisienTS = [int(i) for i in KoefisienTS] |
|
TS = [i[1:] for i in TS] |
|
Produk = Reaksi[2] |
|
Produk = Produk.split('+') |
|
KoefisienProduk = [i[0] for i in Produk] |
|
KoefisienProduk = [-int(i) for i in KoefisienProduk] |
|
Produk = [i[1:] for i in Produk] |
|
|
|
H_reaktan = [] |
|
H_TS = [] |
|
H_produk = [] |
|
|
|
G_reaktan = [] |
|
G_TS = [] |
|
G_produk = [] |
|
|
|
E_reaktan = [] |
|
E_TS = [] |
|
E_produk = [] |
|
|
|
for i in Reaktan: |
|
with open('{}/cmmd.out'.format(i),'r') as f: |
|
for line in f: |
|
if "Total enthalpy" in line: |
|
arr = line.split() |
|
H_reaktan.append(float(arr[3])) |
|
if "Final Gibbs free energy" in line: |
|
arr = line.split() |
|
G_reaktan.append(float(arr[5])) |
|
if "Total thermal energy" in line: |
|
arr = line.split() |
|
E_reaktan.append(float(arr[3])) |
|
|
|
for i in TS: |
|
with open('{}/cmmd.out'.format(i),'r') as f: |
|
for line in f: |
|
if "Total enthalpy" in line: |
|
arr = line.split() |
|
H_TS.append(float(arr[3])) |
|
if "Final Gibbs free energy" in line: |
|
arr = line.split() |
|
G_TS.append(float(arr[5])) |
|
if "Total thermal energy" in line: |
|
arr = line.split() |
|
E_TS.append(float(arr[3])) |
|
for i in Produk: |
|
with open('{}/cmmd.out'.format(i),'r') as f: |
|
for line in f: |
|
if "Total enthalpy" in line: |
|
arr = line.split() |
|
H_produk.append(float(arr[3])) |
|
if "Final Gibbs free energy" in line: |
|
arr = line.split() |
|
G_produk.append(float(arr[5])) |
|
if "Total thermal energy" in line: |
|
arr = line.split() |
|
E_produk.append(float(arr[3])) |
|
|
|
Koefisien_forward = KoefisienReaktan + KoefisienTS |
|
Koefisien_forward = np.array(Koefisien_forward,dtype=int) |
|
Koefisien_backward = KoefisienProduk + KoefisienTS |
|
Koefisien_backward = np.array(Koefisien_backward,dtype=int) |
|
E_forward = E_reaktan + E_TS |
|
E_forward = np.array(E_forward,dtype=float) |
|
E_backward = E_produk + E_TS |
|
E_backward = np.array(E_backward,dtype=float) |
|
delta_E_forward = (np.dot(E_forward,Koefisien_forward))*Ha2kj |
|
delta_E_backward = (np.dot(E_backward,Koefisien_backward))*Ha2kj |
|
print('Ea_forward* = {:.2f} kJ/mol'.format(delta_E_forward)) |
|
print('Ea_backward* = {:.2f} kJ/mol'.format(delta_E_backward)) |
|
|
|
H_forward = H_reaktan + H_TS |
|
H_forward = np.array(H_forward,dtype=float) |
|
H_backward = H_produk + H_TS |
|
H_backward = np.array(H_backward,dtype=float) |
|
delta_H_forward = (np.dot(H_forward,Koefisien_forward))*Ha2kj |
|
delta_H_backward = (np.dot(H_backward,Koefisien_backward))*Ha2kj |
|
print('Delta_H_forward* = {:.2f} kJ/mol'.format(delta_H_forward)) |
|
print('Delta_H_backward* = {:.2f} kJ/mol'.format(delta_H_backward)) |
|
|
|
G_forward = G_reaktan + G_TS |
|
G_forward = np.array(G_forward,dtype=float) |
|
G_backward = G_produk + G_TS |
|
G_backward = np.array(G_backward,dtype=float) |
|
delta_G_forward = (np.dot(G_forward,Koefisien_forward))*Ha2kj |
|
delta_G_backward = (np.dot(G_backward,Koefisien_backward))*Ha2kj |
|
print('Delta_G_forward* = {:.2f} kJ/mol'.format(delta_G_forward)) |
|
print('Delta_G_backward* = {:.2f} kJ/mol'.format(delta_G_backward)) |
|
delta_S_forward = (delta_H_forward - delta_G_forward)/opt.temp*1000 |
|
delta_S_backward = (delta_H_backward - delta_G_backward)/opt.temp*1000 |
|
print('Delta_S_forward* = {:.2f} J/(mol K)'.format(delta_S_forward)) |
|
print('Delta_S_backward* = {:.2f} J/(mol K)'.format(delta_S_backward)) |
|
|
|
if opt.job == 'opt' and opt.software == 'dcdftb': |
|
Energy = [] |
|
Gradient = [] |
|
if os.path.isfile('cmmd.out'): |
|
with open(opt.input,'r') as f: |
|
Natom = int(next(f)) |
|
with open('cmmd.out', 'r') as f: |
|
koord = [] |
|
lines = f.readlines() |
|
for i,line in enumerate(lines): |
|
if 'Final molecular coordinate [Angstrom]' in line: |
|
for j in range(Natom): |
|
koord.append(lines[i+5+j].strip('\n')) |
|
with open('cmmd.xyz', 'w') as fout: |
|
print(Natom,file=fout) |
|
print('File generated by CMMDE output parser',file=fout) |
|
for atom in koord: |
|
print(atom, file=fout) |
|
else: |
|
print("Mohon menunggu hingga perhitungan anda selesai.") |
|
exit |
|
|
|
if opt.job == 'rdf': |
|
rdf(opt.traject,opt.latt,opt.pair,opt.range,opt.resolution) |
|
|
|
if opt.job == 'cv' and opt.software == 'dcdftb': |
|
time = [] |
|
cv = [] |
|
gaus = [] |
|
with open('biaspot','r') as f: |
|
for line in f: |
|
if "THIS RUN'S STEP NO.=" in line: |
|
arr = line.split() |
|
time.append(int(arr[9])/1000.) |
|
if "GAUSSIAN BIAS POTENTIAL:" in line: |
|
arr = line.split() |
|
gaus.append(arr[3]) |
|
if "Coordinate" in line: |
|
arr = line.split() |
|
cv.append(float(arr[2])) |
|
|
|
with open('cv.dat','w') as f: |
|
for i,j in zip(time,cv): |
|
print(i,j,file=f) |
|
time = np.array(time) |
|
# Plot Collective Variable |
|
fig,ax = plt.subplots() |
|
ax2 = ax.twiny() |
|
ax.plot(time,cv,color='blue') |
|
ax.tick_params(direction='in') |
|
ax2.tick_params(direction='in') |
|
|
|
def tick_func(metafreq,step): |
|
gauss = step/metafreq |
|
return [int(x)-1 for x in gauss] |
|
ax.set_xlim(time[0],time[-1]) |
|
ax2.set_xlim(ax.get_xlim()) |
|
newtics = np.arange(min(time),max(time),time[-1]/10) |
|
ax2.set_xticks(newtics) |
|
ax2.set_xticklabels(tick_func(opt.metafreq,newtics*1000)) |
|
ax2.set_xlabel('Number of deposited Gaussian') |
|
plt.grid(linestyle=':') |
|
plt.yticks(np.arange(min(cv),max(cv),0.1)) |
|
ax.set_xlabel('Time [ps]') |
|
if opt.cvtype == 'coordnum': |
|
ax.set_ylabel('Coordination Number') |
|
if opt.cvtype == 'distance': |
|
ax.set_ylabel('Distance [Angstroms]') |
|
if opt.cvtype == 'angle': |
|
ax.set_ylabel('Angle [degree]') |
|
if opt.cvtype == 'dihedral': |
|
ax.set_ylabel('Dihedral [degree]') |
|
if opt.cvtype == 'distancediff': |
|
ax.set_ylabel('Distance diff. [Angstroms]') |
|
if opt.cvtype == 'distanceadd': |
|
ax.set_ylabel('Distance add. [Angstroms]') |
|
if opt.cvtype == 'meandistance': |
|
ax.set_ylabel('Mean distance [Angstroms]') |
|
if opt.cvtype == 'pointplanedistance': |
|
ax.set_ylabel('Point plane distance [Angstroms]') |
|
plt.savefig('cv.pdf',dpi=1200,format='pdf') |
|
|
|
if opt.job == 'fes' and opt.software == 'dcdftb': |
|
fesdata = [] |
|
with open('fes.dat','r') as f: |
|
lines = f.readlines() |
|
for index,line in enumerate(lines): |
|
if 'FREE ENERGY SURFACE CONSISTING OF {} GAUSSIANS'.format(opt.ngaus) in line: |
|
for i in range(int((opt.fesend-opt.fesstart)/opt.fesbin)+1): |
|
fesdata.append(lines[index+1+i].strip()) |
|
with open('fes_{}.dat'.format(opt.ngaus),'w') as f: |
|
for i in fesdata: |
|
print(i,file=f) |
|
|
|
with open('fes_{}.dat'.format(opt.ngaus),'r') as f: |
|
cv = [] |
|
fes = [] |
|
for line in f: |
|
arr = line.split() |
|
cv.append(float(arr[0])) |
|
fes.append(float(arr[1])) |
|
fes = np.array(fes) |
|
# Plot free energy surface |
|
fig,ax = plt.subplots() |
|
ax.plot(cv,fes*2625.5-min(fes*2625.5),color='blue') |
|
ax.tick_params(direction='in') |
|
|
|
ax.set_xlim(cv[0],cv[-1]) |
|
plt.grid(linestyle=':') |
|
plt.ylabel('Free energy [kJ/mol]') |
|
if opt.cvtype == 'coordnum': |
|
plt.xlabel('Coordination Number') |
|
if opt.cvtype == 'distance': |
|
plt.xlabel('Distance [Angstroms]') |
|
if opt.cvtype == 'angle': |
|
plt.xlabel('Angle [degree]') |
|
if opt.cvtype == 'dihedral': |
|
plt.xlabel('Dihedral [degree]') |
|
if opt.cvtype == 'distancediff': |
|
plt.xlabel('Distance diff. [Angstroms]') |
|
if opt.cvtype == 'distanceadd': |
|
plt.xlabel('Distance add. [Angstroms]') |
|
if opt.cvtype == 'meandistance': |
|
plt.xlabel('Mean distance [Angstroms]') |
|
if opt.cvtype == 'pointplanedistance': |
|
plt.xlabel('Point plane distance [Angstroms]') |
|
plt.savefig('fes.pdf',dpi=1200,format='pdf') |
|
|
|
if opt.job == 'barrier' and opt.software == 'dcdftb': |
|
from scipy.signal import argrelextrema |
|
kJ2eV = 1.0364e-2 |
|
x = [] |
|
y = [] |
|
with open('fes_{}.dat'.format(opt.ngaus),'r') as f: |
|
for line in f: |
|
arr = line.split() |
|
x.append(float(arr[0])) |
|
y.append(float(arr[1])) |
|
x = np.array(x) |
|
y = np.array(y) |
|
sortid = np.argsort(x) |
|
x = x[sortid] |
|
y = y[sortid] |
|
|
|
maxm = argrelextrema(y, np.greater) |
|
minm = argrelextrema(y, np.less) |
|
maxval = [float(i) for i in y[maxm]] |
|
minval = [float(i) for i in y[minm]] |
|
|
|
# print('Minimum absis: {}'.format(x[minm])) |
|
# print('Maximum absis: {}'.format(x[maxm])) |
|
# print('Minimum ordinate: {}'.format(y[minm])) |
|
# print('Maximum ordinate: {}'.format(y[maxm])) |
|
|
|
###Activation barrier for forward and backward reactions |
|
|
|
if (len(minval) == 3): |
|
# If exists two transition states |
|
Ef1 = (maxval[1]-minval[2])*2625.5 # in kJ/mol |
|
Ef2 = (maxval[0]-minval[1])*2625.5 |
|
Eb1 = (maxval[0]-minval[0])*2625.5 |
|
Eb2 = (maxval[1]-minval[1])*2625.5 |
|
##Now calculating delta G |
|
deltaG = (minval[-1]-minval[0])*2625.5 # in kJ/mol |
|
print('delta_G: {:.2f} kJ/mol ({:.2f} eV)'.format(deltaG, deltaG*kJ2eV)) |
|
print('delta_G*(backward1): {:.2f} kJ/mol ({:.2f} eV)'.format(Ef1, Ef1*kJ2eV)) |
|
print('delta_G*(backward2): {:.2f} kJ/mol ({:.2f} eV)'.format(Ef2, Ef2*kJ2eV)) |
|
print('delta_G*(forward1): {:.2f} kJ/mol ({:.2f} eV)'.format(Eb1, Eb1*kJ2eV)) |
|
print('delta_G*(forward2): {:.2f} kJ/mol ({:.2f} eV)'.format(Eb2, Eb2*kJ2eV)) |
|
elif (len(minval) == 1): |
|
Ef1 = (maxval[0]-minval[0])*2625.5 |
|
Eb1 = (maxval[0]-y[0])*2625.5 |
|
print('delta_G*(forward): {:.2f} kJ/mol ({:.2f} eV)'.format(Ef1, Ef1*kJ2eV)) |
|
print('delta_G*(backward): {:.2f} kJ/mol ({:.2f} eV)'.format(Eb1, Eb1*kJ2eV)) |
|
deltaG = (y[0]-minval[0])*2625.5 |
|
print('delta_G: {:.2f} kJ/mol ({:.2f} eV)'.format(deltaG, deltaG*kJ2eV)) |
|
else: |
|
Ef1 = (maxval[0]-minval[1])*2625.5 # in kJ/mol |
|
Ef2 = 0 |
|
Eb1 = (maxval[0]-minval[0])*2625.5 |
|
Eb2 = 0 |
|
##Now calculating delta G |
|
deltaG = (minval[-1]-minval[0])*2625.5 # in kJ/mol |
|
print('delta_G: {:.2f} kJ/mol ({:.2f} eV)'.format(deltaG, deltaG*kJ2eV)) |
|
print('delta_G*(backward1): {:.2f} kJ/mol ({:.2f} eV)'.format(Ef1, Ef1*kJ2eV)) |
|
print('delta_G*(backward2): {:.2f} kJ/mol ({:.2f} eV)'.format(Ef2, Ef2*kJ2eV)) |
|
print('delta_G*(forward1): {:.2f} kJ/mol ({:.2f} eV)'.format(Eb1, Eb1*kJ2eV)) |
|
print('delta_G*(forward2): {:.2f} kJ/mol ({:.2f} eV)'.format(Eb2, Eb2*kJ2eV)) |
|
|
|
if opt.job == 'rigiddock': |
|
path = './' |
|
files = [] |
|
ligands = [] |
|
scores = [] |
|
vdw = [] |
|
es = [] |
|
rep = [] |
|
rmsd = [] |
|
mw = [] |
|
for i in os.listdir(path): |
|
if os.path.isdir(os.path.join(path,i)) and 'RigidDock' in i: |
|
files.append(i) |
|
for i in files: |
|
ligands.append(i.split("RigidDock_")[1]) |
|
with open('{}/rigid_scored.mol2'.format(i),'r') as f: |
|
for line in f: |
|
if 'Grid_Score:' in line: |
|
arr = line.split() |
|
scores.append(round(float(arr[2]),2)) |
|
if 'Grid_vdw_energy:' in line: |
|
arr = line.split() |
|
vdw.append(round(float(arr[2]),2)) |
|
if 'Grid_es_energy:' in line: |
|
arr = line.split() |
|
es.append(round(float(arr[2]),2)) |
|
if 'Internal_energy_repulsive:' in line: |
|
arr = line.split() |
|
rep.append(round(float(arr[2]),2)) |
|
if 'HA_RMSDh' in line: |
|
arr = line.split() |
|
rmsd.append(round(float(arr[2]),2)) |
|
if 'Molecular_Weight' in line: |
|
arr = line.split() |
|
mw.append(round(float(arr[2]),2)) |
|
if len(scores) < 20: |
|
t = PrettyTable() |
|
t.add_column("Ligands",ligands) |
|
# t.add_column("Mw [g/mol]",mw) |
|
t.add_column("Scores [kJ/mol]",scores) |
|
t.add_column("VDW [kJ/mol]",vdw) |
|
t.add_column("Elec. [kJ/mol]",es) |
|
# t.add_column("Rep. [kJ/mol]",rep) |
|
if len(rmsd) > 0: |
|
t.add_column("RMSD [Angs.]",rmsd) |
|
print(t.get_string(sortby="Scores [kJ/mol]")) |
|
else: |
|
with open('DockTable.dat','w') as f: |
|
t = PrettyTable() |
|
t.add_column("Ligands",ligands) |
|
# t.add_column("Mw [g/mol]",mw) |
|
t.add_column("Scores [kJ/mol]",scores) |
|
t.add_column("VDW [kJ/mol]",vdw) |
|
t.add_column("Elec. [kJ/mol]",es) |
|
# t.add_column("Rep. [kJ/mol]",rep) |
|
if len(rmsd) > 0: |
|
t.add_column("RMSD [Angs.]",rmsd) |
|
print(t.get_string(sortby="Scores [kJ/mol]"),file=f) |
|
if opt.job == 'flexdock': |
|
path = './' |
|
files = [] |
|
ligands = [] |
|
scores = [] |
|
vdw = [] |
|
es = [] |
|
rep = [] |
|
mw = [] |
|
rmsd = [] |
|
for i in os.listdir(path): |
|
if os.path.isdir(os.path.join(path,i)) and 'FlexDock' in i: |
|
if os.path.exists('{}/flex_scored.mol2'.format(i)): |
|
if os.stat('{}/flex_scored.mol2'.format(i)).st_size !=0: |
|
files.append(i) |
|
for i in files: |
|
ligands.append(i.split("FlexDock_")[1]) |
|
with open('{}/flex_scored.mol2'.format(i),'r') as f: |
|
for line in f: |
|
if 'Grid_Score:' in line: |
|
arr = line.split() |
|
scores.append(round(float(arr[2]),2)) |
|
if 'Grid_vdw_energy:' in line: |
|
arr = line.split() |
|
vdw.append(round(float(arr[2]),2)) |
|
if 'Grid_es_energy:' in line: |
|
arr = line.split() |
|
es.append(round(float(arr[2]),2)) |
|
if 'Internal_energy_repulsive:' in line: |
|
arr = line.split() |
|
rep.append(round(float(arr[2]),2)) |
|
if 'HA_RMSDh' in line: |
|
arr = line.split() |
|
rmsd.append(round(float(arr[2]),2)) |
|
if 'Molecular_Weight' in line: |
|
arr = line.split() |
|
mw.append(round(float(arr[2]),2)) |
|
if len(scores) < 20: |
|
t = PrettyTable() |
|
t.add_column("Ligands",ligands) |
|
# t.add_column("Mw [g/mol]",mw) |
|
t.add_column("Scores [kJ/mol]",scores) |
|
t.add_column("VDW [kJ/mol]",vdw) |
|
t.add_column("Elec. [kJ/mol]",es) |
|
# t.add_column("Rep. [kJ/mol]",rep) |
|
if len(rmsd) > 0: |
|
t.add_column("RMSD [Angs.]",rmsd) |
|
print(t.get_string(sortby="Scores [kJ/mol]")) |
|
else: |
|
with open('DockTable.dat','w') as f: |
|
t = PrettyTable() |
|
t.add_column("Ligands",ligands) |
|
# t.add_column("Mw [g/mol]",mw) |
|
t.add_column("Scores [kJ/mol]",scores) |
|
t.add_column("VDW [kJ/mol]",vdw) |
|
t.add_column("Elec. [kJ/mol]",es) |
|
# t.add_column("Rep. [kJ/mol]",rep) |
|
if len(rmsd) > 0: |
|
t.add_column("RMSD [Angs.]",rmsd) |
|
print(t.get_string(sortby="Scores [kJ/mol]"),file=f) |
|
|
|
if opt.job == 'checkopt' and opt.software == 'dock': |
|
checkopt(opt.nligands) |
|
|
|
# Rescoring docking atau perhitungan lainnya yang melibatkan perhitungan satu titik menggunakan DCDFTB |
|
if opt.job == 'dock' and opt.software == 'dcdftb': |
|
Input = opt.inputreaction |
|
Reaksi = Input.split('->') |
|
Reaktan = Reaksi[0] |
|
Reaktan = Reaktan.split('+') |
|
KoefisienReaktan = [i[0] for i in Reaktan] |
|
KoefisienReaktan = [-int(i) for i in KoefisienReaktan] |
|
Reaktan = [i[1:] for i in Reaktan] |
|
Produk = Reaksi[1] |
|
Produk = Produk.split('+') |
|
KoefisienProduk = [i[0] for i in Produk] |
|
KoefisienProduk = [int(i) for i in KoefisienProduk] |
|
Produk = [i[1:] for i in Produk] |
|
|
|
E_reaktan = [] |
|
E_produk = [] |
|
|
|
for i in Reaktan: |
|
with open('{}/cmmd.out'.format(i),'r') as f: |
|
for line in f: |
|
if "Final DC-DFTB-3rd Energy"in line: |
|
arr = line.split() |
|
E_reaktan.append(float(arr[4])) |
|
elif "Final DFTB-3rd Energy" in line: |
|
arr = line.split() |
|
E_reaktan.append(float(arr[4])) |
|
elif "Final SCC-DFTB Energy" in line: |
|
arr = line.split() |
|
E_reaktan.append(float(arr[4])) |
|
|
|
for i in Produk: |
|
with open('{}/cmmd.out'.format(i),'r') as f: |
|
for line in f: |
|
if "Final DC-DFTB-3rd Energy" in line: |
|
arr = line.split() |
|
E_produk.append(float(arr[4])) |
|
elif "Final DFTB-3rd Energy" in line: |
|
arr = line.split() |
|
E_produk.append(float(arr[4])) |
|
elif "Final SCC-DFTB Energy" in line: |
|
arr = line.split() |
|
E_produk.append(float(arr[4])) |
|
|
|
Koefisien = KoefisienReaktan + KoefisienProduk |
|
Koefisien = np.array(Koefisien,dtype=int) |
|
E = E_reaktan + E_produk |
|
E = np.array(E,dtype=float) |
|
delta_E = (np.dot(E,Koefisien))*Ha2kj |
|
print('Delta_E = {:.2f} kJ/mol'.format(delta_E)) |
|
|
|
if opt.job == 'opt' and opt.software == 'dftb': |
|
os.system('cmmde_gen2poscar.py cmmd.gen > cmmd.vasp') |
|
if opt.job == 'reax' and opt.software == 'dftb': |
|
Input = opt.inputreaction |
|
Reaksi = Input.split('->') |
|
Reaktan = Reaksi[0] |
|
Reaktan = Reaktan.split('+') |
|
KoefisienReaktan = [i[0] for i in Reaktan] |
|
KoefisienReaktan = [-int(i) for i in KoefisienReaktan] |
|
Reaktan = [i[1:] for i in Reaktan] |
|
Produk = Reaksi[1] |
|
Produk = Produk.split('+') |
|
KoefisienProduk = [i[0] for i in Produk] |
|
KoefisienProduk = [int(i) for i in KoefisienProduk] |
|
Produk = [i[1:] for i in Produk] |
|
|
|
E_reaktan = [] |
|
E_produk = [] |
|
|
|
for i in Reaktan: |
|
with open('{}/detailed.out'.format(i),'r') as f: |
|
for line in f: |
|
if "Total energy:"in line: |
|
arr = line.split() |
|
E_reaktan.append(float(arr[2])) |
|
|
|
for i in Produk: |
|
with open('{}/detailed.out'.format(i),'r') as f: |
|
for line in f: |
|
if "Total energy:" in line: |
|
arr = line.split() |
|
E_produk.append(float(arr[2])) |
|
|
|
Koefisien = KoefisienReaktan + KoefisienProduk |
|
Koefisien = np.array(Koefisien,dtype=int) |
|
E = E_reaktan + E_produk |
|
E = np.array(E,dtype=float) |
|
delta_E = (np.dot(E,Koefisien))*Ha2kj |
|
print('Delta_E = {:.2f} kJ/mol'.format(delta_E)) |
|
|
|
if opt.job == 'cell': |
|
os.system('aflow --data < {}'.format(opt.input)) # Untuk menggunakan fitur ini, install aflow, wget http://aflow.org/install-aflow/install-aflow.sh |
|
|
|
|
|
if opt.job == 'dos' and opt.software == 'dftb': |
|
os.system('$DPTOOLS_DIR/dp_dos band.out dos_total.dat') |
|
|
|
if opt.job == 'pdos' and opt.software == 'dftb': |
|
filename = opt.pdos.split('.out')[0] |
|
os.system('$DPTOOLS_DIR/dp_dos -w {} {}.dat'.format(opt.pdos,filename)) |
|
# Plot file x y sembarang dengan ekstensi .dat |
|
if opt.job == 'plot': |
|
x = [] |
|
y = [] |
|
with open(opt.file, 'r') as f: |
|
for line in f: |
|
arr = line.split() |
|
x.append(float(arr[0])) |
|
y.append(float(arr[1])) |
|
x = np.array(x) |
|
y = np.array(y) |
|
fig,ax = plt.subplots() |
|
ax.plot(x,y,color='blue') |
|
ax.tick_params(direction='in') |
|
# fig,ax = plt.subplots() |
|
plt.grid(linestyle=':') |
|
plt.ylim(0,max(y)) |
|
# plt.xticks(np.arange(0,len(x)+1,25)) |
|
# plt.yticks(np.arange(0,max(y),2)) |
|
# ax.tick_params(direction='in') |
|
|
|
# ax.set_xlim(min(x),max(x)) |
|
# ax.set_ylim(min(y),max(y)) |
|
plt.ylabel(opt.ylabel) |
|
plt.xlabel(opt.xlabel) |
|
filename = opt.file.split('.dat')[0] |
|
plt.savefig('{}.pdf'.format(filename),dpi=300,format='pdf') |
|
|
|
if opt.job == 'nci2d': |
|
with open('cmmd.nci','w') as f: |
|
print("""1 |
|
cmmd.wfn |
|
{} |
|
RADIUS 0. 0. 0. 2. |
|
RANGE 3 |
|
-0.5 -0.02 |
|
-0.02 0.02 |
|
0.02 0.5""".format(opt.grid),file=f) |
|
with open('run_nci.sh','w') as f: |
|
print("""#!/bin/bash |
|
#SBATCH --nodes=1 |
|
#SBATCH --ntasks=1 |
|
#SBATCH --cpus-per-task=1 |
|
#SBATCH --time=168:0:0 |
|
export OMP_NUM_THREADS={} |
|
cd $PWD |
|
$NCI_COMMAND cmmd.nci""".format(opt.nproc),file = f) |
|
os.system('sbatch run_nci.sh') |
|
|
|
if opt.job == 'nciplot': |
|
with open('cmmd.gp','w') as f: |
|
print("""set terminal pngcairo size 1000,1000 enhanced font 'Helvetica,20' |
|
set encoding iso_8859_1 |
|
set output 'nci.png' |
|
set key |
|
set ylabel 's(a.u.)' font "Helvetica, 30" |
|
set xlabel 'sign({/Symbol l}_2){/Symbol r}(a.u.)' font "Helvetica, 30" |
|
set pm3d map |
|
# Define a color gradient palette used by pm3d |
|
set palette defined (-0.04 "blue",0.00 "green", 0.04 "red") |
|
set format y "% .2f" |
|
set format x "% .2f" |
|
set format cb "% -.2f" |
|
set border lw 4 |
|
set xtic -0.06,0.01,0.06 nomirror rotate font "Helvetica" |
|
set ytic 0.0,0.25,1.0 nomirror font "Helvetica" |
|
# set the color bar tics |
|
set cbtic -0.06,0.01,0.06 nomirror font "Helvetica" |
|
set xrange [-0.06:0.06] |
|
set yrange [0.0:1.0] |
|
# set the range of values which are colored using the current palette |
|
set cbrange [-0.06:0.06] |
|
plot 'cmmd.dat' u 1:2:1 w p lw 6 palette t '' """,file = f) |
|
os.system('gnuplot cmmd.gp') |
|
|
|
if 'dos' in opt.job and opt.software == 'qe': |
|
with open('cmmd.in','w') as f: |
|
print("""DOS |
|
prefix = 'cmmd_dos', |
|
outdir = {}, |
|
fildos = 'cmmd.dos', |
|
emin = {}, |
|
emax = {}, |
|
/""".format(opt.outdir,opt.emin,opt.emax),file=f) |
|
os.system("$QE_DOS_COMMAND < cmmd.in > cmmd.out") # Hasil perhitungan berupa cmmd.dos |
|
|
|
if 'charge' in opt.job and opt.software == 'qe': |
|
with open("cmmd.in",'w') as f: |
|
print("""&INPUTPP |
|
outdir = {}, |
|
prefix = 'cmmd_charge', |
|
plot_num = 0, |
|
/ |
|
&PLOT |
|
iflag = 3, |
|
output_format = 6, |
|
fileout = 'cmmd_rho.cube', |
|
nx = 64, ny = 64, nz = 64, |
|
/""".format(opt.outdir),file=f) |
|
with open('run.sh','w') as fout: |
|
print("""#!/bin/bash |
|
#SBATCH --nodes=1 |
|
#SBATCH --ntasks=1 |
|
#SBATCH --cpus-per-task=1 |
|
#SBATCH --time=168:0:0 |
|
export OMP_NUM_THREADS=1 |
|
cd $PWD |
|
$QE_PP_COMMAND < cmmd.in > cmmd.out""",file=fout) |
|
os.system('sbatch run.sh') |
|
|
|
if opt.job == 'opt' and opt.software == 'qe': |
|
with open('cmmd.out', 'r') as f: |
|
lines = f.readlines() |
|
for i,line in enumerate(lines): |
|
if "ATOMIC_POSITIONS" in line: |
|
print(lines[i+1])
|
|
|