From 500f7c3fd139c99ea967528007ca2075fa683b50 Mon Sep 17 00:00:00 2001 From: Aditya Wibawa Sakti Date: Wed, 12 Oct 2022 14:50:51 +0900 Subject: [PATCH] added non-slurm calculations --- .DS_Store | Bin 0 -> 6148 bytes bin/cmmde.py | 247 ++++++++++++------- lib/__pycache__/cmmde_dcdftb.cpython-39.pyc | Bin 7221 -> 7222 bytes lib/__pycache__/cmmde_dftb.cpython-39.pyc | Bin 7156 -> 7157 bytes lib/__pycache__/cmmde_dock.cpython-39.pyc | Bin 14926 -> 14927 bytes lib/__pycache__/cmmde_hubbard.cpython-39.pyc | Bin 813 -> 822 bytes lib/__pycache__/cmmde_mass.cpython-39.pyc | Bin 1660 -> 1661 bytes lib/__pycache__/cmmde_mdpro.cpython-39.pyc | Bin 1721 -> 1722 bytes lib/__pycache__/cmmde_nw.cpython-39.pyc | Bin 1085 -> 1086 bytes lib/__pycache__/cmmde_orca.cpython-39.pyc | Bin 2504 -> 2505 bytes lib/__pycache__/cmmde_qe.cpython-39.pyc | Bin 3328 -> 3329 bytes lib/__pycache__/cmmde_xtb.cpython-39.pyc | Bin 3730 -> 3888 bytes lib/cmmde_hubbard.py | 1 + lib/cmmde_xtb.py | 18 +- 14 files changed, 177 insertions(+), 89 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..eed9f75fdbaa2192b5094ef02499f6540fcc81a5 GIT binary patch literal 6148 zcmeHKJxc>Y5S>k~hzUXpk(Ad9VhT(33}<6u6Kn)glSm9CUQh#;*V)($b~f7DTbM%d z2dLOu_yh6}^v&+Z>~S$=5Sa2-tflz4P~i@tjCG0>hg1BadU3nFAr9GI;V~6M5BypYa*ZObG{j>QwP5W z9nv0F+@n?^H*N2Z_j2nfl&*$rA2Xj@(`3&?eWbU{9O^o!160_hHpZuJb(w|h0jf*+ zxV1fR-VSRU<2Pb!lAl{wX5|AZ@t)dvPc^q1%D?wV7Pp44rHA>o;d|0?E+=WLn~!FB zQjsY!fHRvVS1>5OFdz&F13wJ#{@|lA1{Pz3dh0-^uK+*~YAqP+vmNNO0vK3~4MGD^ zCKPBwmAzsp6Ary^{Q`@zK@(0&XU04>v$8i7rL#ltYj;wCLFt77VIavs);t#Z{NMQf z{+|qzCt*Ms_*V=lFRX?YEXkg&sm1YG>!a literal 0 HcmV?d00001 diff --git a/bin/cmmde.py b/bin/cmmde.py index ff2bf9b..2f34515 100755 --- a/bin/cmmde.py +++ b/bin/cmmde.py @@ -28,7 +28,7 @@ parser.add_argument('-m','--method',type=str,default='XTB2',help='Metode yang di parser.add_argument('-sfreq','--scalefreq',type=float,default=1, help='Faktor skala frekuensi yang digunakan.') # Input yang berkaitan dengan perhitungan menggunakan software DCDFTBMD parser.add_argument('-disp','--dispersion',type=str,default='None', help='Model koreksi dispersi jika menggunakan software DCDFTB. Pilihan: None, D3, D3BJ, D3H5.') -parser.add_argument('-para','--parapath',type=str,default='/home/adit/opt/dftbplus/external/slakos/origin/3ob-3-1',help='Lokasi folder berisikan himpunan parameter DFTB yang akan digunakan.') +parser.add_argument('-para','--parapath',type=str,default='/Users/adit/opt/dftbplus/external/slakos/origin/3ob-3-1',help='Lokasi folder berisikan himpunan parameter DFTB yang akan digunakan.') parser.add_argument('-iter','--iter',type=int,default=9999, help='Jumlah iterasi dalam optimasi geometri dan jenis perhitungan lainnya') parser.add_argument('-ens','--ensembel',type=str,default='NVE', help='Ensembel yang digunakan dalam simulasi dinamika molekul. Pilihan: NVE, NVT, dan NPT.') parser.add_argument('-tstat','--thermostat',type=str,default='andersen', help='Termostat yang digunakan dalam simulasi NVT. Pilihan: andersen,berendsen,dan nose') @@ -180,6 +180,7 @@ parser.add_argument('-cpress','--cellpress',type=float,default=0.0,help='Tekanan parser.add_argument('-press_conv','--press_conv_thr',type=float,default=0.5,help='Kriteria konvergensi untuk tekanan sel. Default=0.5 kbar.') parser.add_argument('-nband','--nband',type=int,default=8,help='Jumlah tingkat energi yang ingin diplot dalam DOS.') parser.add_argument('-occ','--occ',type=str,default='tetrahedra',help='Metode smearing yang digunakan. Default: tetrahedra. Pilihan: smearing, tetrahedra_lin, tetrahedra_opt, fixed, from_input.') +parser.add_argument("-slurm","--slurm",type=str,default="true",help="Apakah akan menggunakan slurm atau tidak. Default: true") opt=parser.parse_args(sys.argv[1:]) @@ -187,8 +188,9 @@ opt=parser.parse_args(sys.argv[1:]) if ('.xyz' or '.pdb' or 'POSCAR' or '.vasp' or '.poscar') in opt.input: geom = opt.input elif '.mol2' in opt.input: - with open('run_babel.sh','w') as fout: - print("""#!/bin/bash + if opt.slurm == "true": + with open('run_babel.sh','w') as fout: + print("""#!/bin/bash #SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --cpus-per-task=1 @@ -196,20 +198,37 @@ elif '.mol2' in opt.input: export OMP_NUM_THREADS={} cd $PWD obabel {} -O geom.xyz""".format(opt.nproc,opt.input),file=fout) - os.system('sbatch run_babel.sh') + os.system('sbatch run_babel.sh') + else: + with open('run_babel.sh','w') as fout: + print("""#!/bin/bash +export OMP_NUM_THREADS={} +cd $PWD +obabel {} -O geom.xyz""".format(opt.nproc,opt.input),file=fout) + os.system("chmod +x run_babel.sh") + os.system('./run_babel.sh') geom = 'geom.xyz' elif ('.mol2' not in opt.input and '.xyz' not in opt.input and '.pdb' not in opt.input and '.vasp' not in opt.input and '.poscar' not in opt.input and 'POSCAR' not in opt.input and '.gen' not in opt.input): os.system("echo '{}' > geom.smi".format(opt.input)) - with open('run_babel.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={} -cd $PWD -obabel geom.smi -O geom.xyz --gen3d""".format(opt.nproc),file=fout) - os.system('sbatch run_babel.sh') + if opt.slurm == "true": + with open('run_babel.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={} + cd $PWD + obabel geom.smi -O geom.xyz --gen3d""".format(opt.nproc),file=fout) + os.system('sbatch run_babel.sh') + else: + with open('run_babel.sh','w') as fout: + print("""#!/bin/bash + export OMP_NUM_THREADS={} + cd $PWD + obabel geom.smi -O geom.xyz --gen3d""".format(opt.nproc),file=fout) + os.system("chmod +x run_babel.sh") + os.system('./run_babel.sh') while not os.path.exists('geom.xyz'): time.sleep(3) geom = 'geom.xyz' @@ -236,6 +255,7 @@ if opt.software == 'dock': addcharge(opt.input,opt.chargetype) if opt.job == 'sphgen': sphgen(opt.input) + if opt.slurm == 'true': with open('run_sphgen.sh','w') as fout: print("""#!/bin/bash #SBATCH --nodes=1 @@ -247,46 +267,81 @@ cd $PWD $DOCK_DIR/sphgen $DOCK_DIR/sphere_selector protein.sph {} {}""".format(opt.nproc,opt.ligand,opt.dockrange),file=fout) os.system("sbatch run_sphgen.sh") - + else: + with open('run_sphgen.sh','w') as fout: + print("""#!/bin/bash +export OMP_NUM_THREADS={} +cd $PWD +$DOCK_DIR/sphgen +$DOCK_DIR/sphere_selector protein.sph {} {}""".format(opt.nproc,opt.ligand,opt.dockrange),file=fout) + os.system("chmod +x run_sphgen.sh") + os.system("./run_sphgen.sh") if opt.job == 'showsphere': showsphere() if opt.job == 'gridgen': gridgen(opt.input) - with open('run_grid.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={} -cd $PWD -$DOCK_DIR/grid -i grid.in""".format(opt.nproc),file=fout) - os.system("sbatch run_grid.sh") - + if opt.slurm == "true": + with open('run_grid.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={} + cd $PWD + $DOCK_DIR/grid -i grid.in""".format(opt.nproc),file=fout) + os.system("sbatch run_grid.sh") + else: + with open('run_grid.sh','w') as fout: + print("""#!/bin/bash + export OMP_NUM_THREADS={} + cd $PWD + $DOCK_DIR/grid -i grid.in""".format(opt.nproc),file=fout) + os.system("chmod +x run_grid.sh") + os.system("./run_grid.sh") + if opt.job == 'rigiddock': rigiddock(opt.ligand,opt.calcrmsd) - with open('run_rigiddock.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={} -cd $PWD -$DOCK_DIR/dock6 -i rigid.in -o rigid.out""".format(opt.nproc),file=fout) - os.system("sbatch run_rigiddock.sh") + if opt.slurm == "true": + with open('run_rigiddock.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={} + cd $PWD + $DOCK_DIR/dock6 -i rigid.in -o rigid.out""".format(opt.nproc),file=fout) + os.system("sbatch run_rigiddock.sh") + else: + with open('run_rigiddock.sh','w') as fout: + print("""#!/bin/bash + export OMP_NUM_THREADS={} + cd $PWD + $DOCK_DIR/dock6 -i rigid.in -o rigid.out""".format(opt.nproc),file=fout) + os.system("chmod +x run_rigiddock.sh") + os.system("./run_rigiddock.sh") if opt.job == 'flexdock': flexdock(opt.ligand,opt.calcrmsd) - with open('run_flexdock.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={} -cd $PWD -$DOCK_DIR/dock6 -i flex.in -o flex.out""".format(opt.nproc),file=fout) - os.system("sbatch run_flexdock.sh") + if opt.slurm == "true": + with open('run_flexdock.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={} + cd $PWD + $DOCK_DIR/dock6 -i flex.in -o flex.out""".format(opt.nproc),file=fout) + os.system("sbatch run_flexdock.sh") + else: + with open('run_flexdock.sh','w') as fout: + print("""#!/bin/bash + export OMP_NUM_THREADS={} + cd $PWD + $DOCK_DIR/dock6 -i flex.in -o flex.out""".format(opt.nproc),file=fout) + os.system("chmod +x run_flexdock.sh") + os.system("./run_flexdock.sh") if opt.job == 'translig': translig(opt.ligand) @@ -312,17 +367,27 @@ if opt.software == 'dftb': geom = 'in.gen' dftb(geom,opt.job,opt.activeatoms,opt.method,opt.parapath,opt.dispersion,opt.kpts,opt.hcorr) - 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={} -cd $PWD -cp cmmd.in dftb_in.hsd -$DFTB_COMMAND cmmd.in > cmmd.out""".format(opt.nproc),file=fout) - os.system('sbatch run.sh') + if opt.slurm == "true": + 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={} + cd $PWD + cp cmmd.in dftb_in.hsd + $DFTB_COMMAND cmmd.in > cmmd.out""".format(opt.nproc),file=fout) + os.system('sbatch run.sh') + else: + with open('run.sh','w') as fout: + print("""#!/bin/bash + export OMP_NUM_THREADS={} + cd $PWD + cp cmmd.in dftb_in.hsd + $DFTB_COMMAND cmmd.in > cmmd.out""".format(opt.nproc),file=fout) + os.system("chmod +x run.sh") + os.system('./run.sh') if opt.software == 'qe': @@ -330,33 +395,47 @@ if opt.software == 'qe': # RUNNING SCRIPT if opt.software == 'orca': - with open('run.sh','w') as fout: - print("""#!/bin/bash -#SBATCH --nodes=1 -#SBATCH --ntasks=1 -#SBATCH --cpus-per-task={} -#SBATCH --time=168:0:0 -export LD_LIBRARY_PATH=/home/adit/opt/openmpi411/lib:$LD_LIBRARY_PATH -export PATH=/home/adit/opt/openmpi411/bin:$PATH -export OMP_NUM_THREADS=1 -cd $PWD -$ORCA_COMMAND cmmd.in > cmmd.out --oversubscribe""".format(opt.nproc),file=fout) - os.system('sbatch run.sh') - + if opt.slurm=="true": + with open('run.sh','w') as fout: + print("""#!/bin/bash + #SBATCH --nodes=1 + #SBATCH --ntasks=1 + #SBATCH --cpus-per-task={} + #SBATCH --time=168:0:0 + export LD_LIBRARY_PATH=/home/adit/opt/openmpi411/lib:$LD_LIBRARY_PATH + export PATH=/home/adit/opt/openmpi411/bin:$PATH + export OMP_NUM_THREADS=1 + cd $PWD + $ORCA_COMMAND cmmd.in > cmmd.out --oversubscribe""".format(opt.nproc),file=fout) + os.system('sbatch run.sh') + else: + with open('run.sh','w') as fout: + print("""#!/bin/bash + cd $PWD + $ORCA_COMMAND cmmd.in > cmmd.out --oversubscribe""",file=fout) + os.system("chmod +x run.sh") + os.system('./run.sh') if opt.software == 'nwchem': - with open('run.sh','w') as fout: - print("""#!/bin/bash -#SBATCH --nodes=1 -#SBATCH --ntasks=1 -#SBATCH --cpus-per-task={} -#SBATCH --time=168:0:0 -export LD_LIBRARY_PATH=/home/adit/opt/openmpi411/lib:$LD_LIBRARY_PATH -export PATH=/home/adit/opt/openmpi411/bin:$PATH -export OMP_NUM_THREADS=1 -cd $PWD -$NWCHEM_COMMAND cmmd.in > cmmd.out""".format(opt.nproc),file=fout) - os.system('sbatch run.sh') - + if opt.slurm=="true": + with open('run.sh','w') as fout: + print("""#!/bin/bash + #SBATCH --nodes=1 + #SBATCH --ntasks=1 + #SBATCH --cpus-per-task={} + #SBATCH --time=168:0:0 + export LD_LIBRARY_PATH=/home/adit/opt/openmpi411/lib:$LD_LIBRARY_PATH + export PATH=/home/adit/opt/openmpi411/bin:$PATH + export OMP_NUM_THREADS=1 + cd $PWD + $NWCHEM_COMMAND cmmd.in > cmmd.out""".format(opt.nproc),file=fout) + os.system('sbatch run.sh') + else: + with open('run.sh','w') as fout: + print("""#!/bin/bash + cd $PWD + $NWCHEM_COMMAND cmmd.in > cmmd.out""",file=fout) + os.system("chmod +x run.sh") + os.system('./run.sh') if opt.software == 'qe': with open('run.sh','w') as fout: print("""#!/bin/bash @@ -403,4 +482,4 @@ if opt.job == 'ligprep' and opt.software == 'gmx': # Program XTB Standalone if opt.software == 'xtb': - xtb(opt.job,geom,opt.nproc,opt.produk,opt.temp,opt.nrun,opt.npoint,opt.anopt,opt.kpush,opt.kpull,opt.ppull,opt.alp,opt.distance,opt.angle,opt.dihedral,opt.scanmode,opt.iter,opt.scan,opt.solvent,opt.charge,opt.mult,opt.method,opt.fixedatoms,opt.fixedelements) \ No newline at end of file + xtb(opt.job,geom,opt.nproc,opt.produk,opt.temp,opt.nrun,opt.npoint,opt.anopt,opt.kpush,opt.kpull,opt.ppull,opt.alp,opt.distance,opt.angle,opt.dihedral,opt.scanmode,opt.iter,opt.scan,opt.solvent,opt.charge,opt.mult,opt.method,opt.fixedatoms,opt.fixedelements,opt.slurm) \ No newline at end of file diff --git a/lib/__pycache__/cmmde_dcdftb.cpython-39.pyc b/lib/__pycache__/cmmde_dcdftb.cpython-39.pyc index fc3bff7945e97496f9f968f624142b6a7760740b..1bd29b6f85c2d2f31653e49950d2460284d115d6 100644 GIT binary patch delta 48 zcmdmLvCV=zk(ZZ?0SFEknr`G~loHd_4=qkDD%MX-$t=;&FDTJZ&dp6p-K;1j!UO<6 CstvdR delta 47 zcmdmHvDJb*k(ZZ?0SH1^_%?DgN{MRdXXNLm>L;dTmgwgfl;}JA`ntGoR+1870sslK B3#$MC diff --git a/lib/__pycache__/cmmde_dftb.cpython-39.pyc b/lib/__pycache__/cmmde_dftb.cpython-39.pyc index 0d50f6e3dac63d012ad06d0bc32280adf81a944e..972b52af890fbe8a079cc9695017a6c8916b74b3 100644 GIT binary patch delta 48 zcmexj{?(j2k(ZZ?0SFEknr`G)VG&c;4=qkDD%MX-$t=;&FDTJZ&dp6p-R#1$K^y>C CZ4Uha delta 47 zcmexr{>7X-k(ZZ?0SH1^_%?E@u!ySZXXNLm>L;dTmgwgfl;}JA`ntGoc4gTh4gezW B4DbK| diff --git a/lib/__pycache__/cmmde_dock.cpython-39.pyc b/lib/__pycache__/cmmde_dock.cpython-39.pyc index 03062f1bf0881889b84e20790298245996340796..281c7206c76faf8861b3190c812694b0ab4c769a 100644 GIT binary patch delta 48 zcmX?Ca=wH+k(ZZ?0SFEknr`HdViHr=4=qkDD%MX-$t=;&FDTJZ&dp6p-CV_V#T)== CxewO> delta 47 zcmX?Ka;}6sk(ZZ?0SH1^_%?D!F^Q__XXNLm>L;dTmgwgfl;}JA`ntGou4cMo4gfLP B4axuj diff --git a/lib/__pycache__/cmmde_hubbard.cpython-39.pyc b/lib/__pycache__/cmmde_hubbard.cpython-39.pyc index a405000249dbdedf64ec79fa13da05f7f45f230a..54a17fcb17ffd75f14cd5c496b73d8b7db0cb0b5 100644 GIT binary patch delta 128 zcmZ3>wvCN9k(ZZ?0SMAg+9%6R~=Yjec3^h1kNi;DFVQ!-2R^9xG!lXG)ZQYY&%$}<{G b_G2_)Wn_BECb_whF@=#)Zt^oGH%3_iasnV7 delta 128 zcmdnSww8@Ik(ZZ?0SH1^_>%c1@_O)!13At>Tx|7PflP| aXJ=$$WO~IWvAK&eg^^Kq@_QyXMi~IZ8630# diff --git a/lib/__pycache__/cmmde_mass.cpython-39.pyc b/lib/__pycache__/cmmde_mass.cpython-39.pyc index 808a9a78d0092854c493d00b62d78b4e2e7ec3fb..81768b001c4ac27b215a97641ab269d86b3469ca 100644 GIT binary patch delta 48 zcmeyv^OuJ^k(ZZ?0SFEknr`F{V--`^4=qkDD%MX-$t=;&FDTJZ&dp6p-CV}X#s~mX CLk?X4 delta 47 zcmey%^M{8!k(ZZ?0SH1^_%?Efv5KncXXNLm>L;dTmgwgfl;}JA`ntGoE@x$91OOY@ B3{U_7 diff --git a/lib/__pycache__/cmmde_mdpro.cpython-39.pyc b/lib/__pycache__/cmmde_mdpro.cpython-39.pyc index 1e6f13ec4b2750e1bb88dabe8ada2c860ce3f4f8..e1358d350195c85f5accd28f21824f2d1822fe6a 100644 GIT binary patch delta 47 zcmdnVyNj1Qk(ZZ?0SFEknoi{YEvBI#TAW%`te=>YS)!j`P@01h4u AiU0rr diff --git a/lib/__pycache__/cmmde_nw.cpython-39.pyc b/lib/__pycache__/cmmde_nw.cpython-39.pyc index 35d584c067cf4266c251a481da0d4925a4a592e3..ef317ea05546076766b6db2e1edb4b2a965d7aa6 100644 GIT binary patch delta 47 zcmdnXv5$j0k(ZZ?0SFEknr`H-V-{1@4=qkDD%MX-$t=;&FDTJZ&dp6poji|uJ^(O- B4w(P| delta 46 zcmdnTv6q88k(ZZ?0SH1^_%?FaF^j6`XXNLm>L;dTmgwgfl;}JA`ntGIp3giV0Q`6i Ai~s-t diff --git a/lib/__pycache__/cmmde_orca.cpython-39.pyc b/lib/__pycache__/cmmde_orca.cpython-39.pyc index e3a9b1db2dcb0116cca3d229788ca66c9784bfa3..b349c4387ee4f4430132017ba4611c72cfc7f376 100644 GIT binary patch delta 48 zcmX>hd{US@k(ZZ?0SFEknr`H-<`7fY4=qkDD%MX-$t=;&FDTJZ&dp6p-8`E^mk|I* CM-F-b delta 47 zcmX>pd_tHzk(ZZ?0SH1^_%?D^bBLL;dTmgwgfl;}JA`ntGop2MNb2mlcd B3~c}a diff --git a/lib/__pycache__/cmmde_qe.cpython-39.pyc b/lib/__pycache__/cmmde_qe.cpython-39.pyc index 1d879c8e97e9966ef8b0676575f56cb8e3aa7392..1c24dd8e25c6ae977222d2373e9cff71170107e6 100644 GIT binary patch delta 48 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