From bc27da4e930cda8fd0db712f4d7d0fb881810b7e Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 12:21:35 +0000 Subject: [PATCH 01/16] adding xTB and fixing psi4 bugs --- QCflow-env.err | 7 + QCflow-env.out | 1 + QCflow.yml | 2 - QCflow/__init__.py | 2 + QCflow/__pycache__/__init__.cpython-313.pyc | Bin 583 -> 689 bytes .../energy_calculations.cpython-313.pyc | Bin 8071 -> 8113 bytes .../__pycache__/find_torsion.cpython-313.pyc | Bin 2816 -> 2858 bytes QCflow/__pycache__/fragments.cpython-313.pyc | Bin 5937 -> 5985 bytes .../__pycache__/load_gaussian.cpython-313.pyc | Bin 3049 -> 3091 bytes .../__pycache__/run_gaussian.cpython-313.pyc | Bin 8319 -> 8361 bytes QCflow/__pycache__/run_psi4.cpython-313.pyc | Bin 3118 -> 3160 bytes QCflow/__pycache__/run_xTB.cpython-313.pyc | Bin 0 -> 3199 bytes QCflow/__pycache__/sa_score.cpython-313.pyc | Bin 1359 -> 1401 bytes QCflow/__pycache__/slurm.cpython-313.pyc | Bin 10871 -> 10913 bytes .../__pycache__/testing_data.cpython-313.pyc | Bin 3064 -> 3106 bytes .../torsion_parser.cpython-313.pyc | Bin 16788 -> 16832 bytes .../write_gaussian.cpython-313.pyc | Bin 6407 -> 6459 bytes QCflow/__pycache__/write_psi4.cpython-313.pyc | Bin 15342 -> 15437 bytes QCflow/__pycache__/write_xTB.cpython-313.pyc | Bin 0 -> 18423 bytes QCflow/run_xTB.py | 76 ++++ QCflow/write_psi4.py | 8 +- QCflow/write_xTB.py | 333 ++++++++++++++++++ build/lib/QCflow/__init__.py | 2 + build/lib/QCflow/run_xTB.py | 76 ++++ build/lib/QCflow/write_psi4.py | 8 +- build/lib/QCflow/write_xTB.py | 333 ++++++++++++++++++ install_pk.sh | 19 + qcflow.egg-info/SOURCES.txt | 2 + timer.dat | 28 ++ 29 files changed, 887 insertions(+), 10 deletions(-) create mode 100644 QCflow-env.err create mode 100644 QCflow-env.out create mode 100644 QCflow/__pycache__/run_xTB.cpython-313.pyc create mode 100644 QCflow/__pycache__/write_xTB.cpython-313.pyc create mode 100644 QCflow/run_xTB.py create mode 100644 QCflow/write_xTB.py create mode 100644 build/lib/QCflow/run_xTB.py create mode 100644 build/lib/QCflow/write_xTB.py create mode 100644 install_pk.sh create mode 100644 timer.dat diff --git a/QCflow-env.err b/QCflow-env.err new file mode 100644 index 0000000..fe8c330 --- /dev/null +++ b/QCflow-env.err @@ -0,0 +1,7 @@ +warning libmamba 'repo.anaconda.com', a commercial channel hosted by Anaconda.com, is used. + +warning libmamba Please make sure you understand Anaconda Terms of Services. + +warning libmamba See: https://legal.anaconda.com/policies/en/ +micromamba: /home/conda/feedstock_root/build_artifacts/bld/rattler-build_libsolv-static_1754325691/work/src/rules.c:261: solver_addrule: Assertion `!p2 && d > 0' failed. +/var/lib/slurm/slurmd/job31669382/slurm_script: line 19: 2297279 Aborted (core dumped) $MICROMAMBA env create -f QCflow.yml -y diff --git a/QCflow-env.out b/QCflow-env.out new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/QCflow-env.out @@ -0,0 +1 @@ + diff --git a/QCflow.yml b/QCflow.yml index e06a608..c476a35 100644 --- a/QCflow.yml +++ b/QCflow.yml @@ -2,8 +2,6 @@ name: QCflow channels: - conda-forge - lich - - defaults - - anaconda dependencies: - brotli - brotli-bin diff --git a/QCflow/__init__.py b/QCflow/__init__.py index 72ea573..77dbda4 100755 --- a/QCflow/__init__.py +++ b/QCflow/__init__.py @@ -10,3 +10,5 @@ from . import write_psi4 from . import run_psi4 from . import sa_score +from . import write_xTB +from . import run_xTB diff --git a/QCflow/__pycache__/__init__.cpython-313.pyc b/QCflow/__pycache__/__init__.cpython-313.pyc index 6d0076c39afb05c1bc2828c66bdff59a3427716b..c60f28675e487b2fa60df38de06fd12850428be8 100644 GIT binary patch delta 218 zcmX@kvXPbdGcPX}0}#yMDb2{5$ScXXW}^C3nP7%sUT+33-XdNF1|XXc$mT2JQ(#Ev z*A$p|V6U_$<1NneqRf)i_=*rGAcwuEG!Mk|)8wDrz-Sj+#1AyGNB~HzWcUm+{#J^9 za%w?FTCsjveokp_YO#JsL2`UbVo73rX>pN$wvmyksfmT9zLAAlTB2oQif)RLxsk3( zl6i`5qH$`fZgO(6SxTCLky)}y^5o}?s$8N#Lm7d%Sbwq@lP2F?2C=&g;`bOti-duK E0DS;DWup32mULcCzKJ*XGW%)rPTs(1r@4~hGf2@b zEB(;o)S_bj;*!#o)Vvb?!sN7^{BkIzYoKQ|*_%m~OBkq>5r~U5Cs#3Pa@=DOD-r~9 E0USdfg#Z8m diff --git a/QCflow/__pycache__/energy_calculations.cpython-313.pyc b/QCflow/__pycache__/energy_calculations.cpython-313.pyc index 94d239ded87d51ab2ff8ae83f91819da7f08e7f7..fcaa04d77f35d6ad0e50d4ad13142f7d9c65f8e2 100644 GIT binary patch delta 101 zcmZp--)PVMnU|M~0SG29DBH;WlEph;KRLA^Bdu7!EI+3-H?>$lqaZmxC9xzizO=YV zKikO2)YQbnQs2nJEG^M8F-14U$lOTRB*{EQH_J22avocYQT7DGQXG+ Zzqqpi+aXC|XEC-zwtUVqlLN#a0sy+LH4Fd% delta 121 zcmaE;w^5JhGcPX}0}uqIzDnQ7Bf_d^tsh#PT2!oGTvD2nnpdJMwaG8t55q JR%Lm|4gg016ZHT9 diff --git a/QCflow/__pycache__/run_gaussian.cpython-313.pyc b/QCflow/__pycache__/run_gaussian.cpython-313.pyc index 25cd30de144691c09ec1a783aee880d82d056825..80f345e9b8e326cd12f6731ee24545e427a91773 100644 GIT binary patch delta 102 zcmezGu+ov|GcPX}0}#wwDUh*|=O(LnhJJEtK}K4!ep!A_X>MwaG8t55q JHejoi0sv(J6e<7! diff --git a/QCflow/__pycache__/run_psi4.cpython-313.pyc b/QCflow/__pycache__/run_psi4.cpython-313.pyc index e1a8511f9c6d2b6acbd7d7c38c38d56eb069d93a..8df41d48b3381027a6b160aec59f92b77bd3049e 100644 GIT binary patch delta 102 zcmZ1{aYKUVGcPX}0}!wpmSt?@dCcjZqMw{vkdaobUzVR!nwwgzpHYw;pORRT7++dk zq@QhMWNK<+VX1FqVV0I?nV6!RVq|WlYm#K1qMK-(nyQG8t55q Jw&Idw0su@{6I=iQ diff --git a/QCflow/__pycache__/run_xTB.cpython-313.pyc b/QCflow/__pycache__/run_xTB.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b83dd62d2cc523391edbe1bcd404eea0cef77ac GIT binary patch literal 3199 zcmbVO%WvF77@ysEcfD?trY{}^(V?^?TbfOqXB#0TnzkuwQ_|grrizd?YtQaF_1e~q zod<^sxU@W^=7LlK66IEI{0WE?$3lvbCOIIHOK(UmcfRo}jv55Q((Zio%{Slk_kH%0 z?rsgi^XPo%q5L(Ew-K~73@K`!i$%)+YD@G}HOfJ&>F8Dop58V9% z%}ZYR)Drg-2CTJ0W)qXMxgIo{i#Gi+kGz1gnu^cfI)bwIFnYI|v8?{Pd`9{|XrG1D zPs|}i#=)H zSniUR&3#DHN=WYx=|V_@_rNcP-T{C9U`Ee-qe`^HX#V*OeRCaUe2 zoy_@8RemYGo)VcGFQ?3uID$rFI>}SAV$>>CRN??|w0h9!SU$%DFJC*04PqOCO?=CB zur}XHgpI0xS#v1GJ&tPDfU-9irprLGpU6I zP8H9%oLdc>;zeQyluu|Fo&ntFdVb#oe%JG@j>RLx4h?)p>_ox{xgaz}U9itqFx=Ua zj*f9ZFml7!(I%`#Pe6QOXstw3zoQ#E>?(;d;y~#CXe&I8Op$*x z70G5Tk!_Z^ryF3X9{K9Img8?rf5!V%36UaU1W`bV*Px614_%Rqv8s-1M}?fgP{~m9 z6w$+04v#KTqdB=hTZ%Njt-?@CgE-ykj&t8FY0YD(a6JhOKhu8^JxSTU_VV-%;HfOjF$N^Yzg4{%`7C1Z{G}~G@kPRC;+KTO(S)&%iK5$thm1R&xC z02+zICChI|AdLnC)L=)$B$*7)bX!%s00G+e%85`vZ%LRm*7K6;XY^AD+E{MC57hRA(QBKn&icwdKLfDZ)k+UKE zCs!(aMBe2>@rd6RMY;^Yh7WDko>+n%AD#3y>d+2GBgq0!Ni(`N>UPLDOo8Db8YL*qjOBaLx$ zfDBVQU>L@j**rNkW{envS0|gcyOb>O+LEcMdMlz7)9e@+?|~m*hrbWe(+fGIYPXj@ zTDpDfqg(f0xTpPAI{I_z=!UA@RXY?6Wmmi$@q4Kb?@QZr$&mt=C zUF}~}58YQE^sV7j-!K30+}ilmPje5izrQy9{-*l!y}9oXJyNHhs;F>qb?(7|N6N^i za$t4tk=XyJL0; zp;Rcoqrh>IQmk104$gfj$h(byQwQyVlX( Pb+qR%<*nQsp}xNXixGAe literal 0 HcmV?d00001 diff --git a/QCflow/__pycache__/sa_score.cpython-313.pyc b/QCflow/__pycache__/sa_score.cpython-313.pyc index 5c48f6ed4c2f56fc9e96732bd7bb2d23e446166c..83e41af98f66c7a0a23ebe9dd4ffed6c96cff519 100644 GIT binary patch delta 101 zcmX@l^^=SHGcPX}0}#wwDX@`yHM4h$esXF-Mq06cS$Vc*ETnpx3GKeRZts93+aq%Iln4+6vWNxHul4PEun`oSxs+*jgY?hK{U}TnTlDv5$-!o|d Dit!+i delta 59 zcmZ1&`aOjEGcPX}0}xDIz`l_?l~2)JKeRZts93+aq%M|GWh{-9g{G_<~Y6@R>nn>Zwq%Yb33bSP7~471psnEECc`m delta 91 zcmX@m%s8c)k^3_*FBbz4?A*`3k^3;SqJw^DacWVqesM`@N@`w-eqnN2PJTI*(lyXC p+APU(l9TbmOO-kQ^IJu&_M?LnucQD~QbF2o}lX^+(pa z`78?$pLdpia%w?FTCsjveokp_YO#JsL2`UbVo73rX>pN$wvmyksfmT9zLAAlTB2oQ zif)RLxsk3(l6i`5qH$`fZgO(6SxTCLky)}y^5kDa(TuAmhY2qLlHY~vfn>ReHshkn zi$&5IS8e7Ny~3m+>94_Z$Wqc@m*psjq`wi%Q7b-wbC%;QlKwUwH6S%Fb+ascC7#_5yo znB*CaCdV=90Qshq4>Ijw%z?@pPQJ}-IGK+nSlEt%A(SJD6-4H71dHVH`onc>zRtqK zr|6&`TAW%`tY2JGnv$AVqFDRR+$FpKNZN~vPj(W?0J2t# zXfrOHd|f1+aph)v(JM?E68_38hb$!gHCT?aN%-rs95n~p#d4fM!rz?bl(;LizYX(w M8?FGZ#nuvx07-#CuK)l5 diff --git a/QCflow/__pycache__/write_psi4.cpython-313.pyc b/QCflow/__pycache__/write_psi4.cpython-313.pyc index c8a78d52e52f29a9087f9aaf0f6ea3a42bdcaccb..2762c1eb8d9684fea8fa199f9b93f17fcf709eb0 100644 GIT binary patch delta 656 zcmYk2&1(}u7>8#zu}#xmTaku@#(Y^#Qj>18+1)gzY2%?vwMuEKq^G#<&ZZ&F2eXMS z1+fYqdVUe~Bz{~JL}V|;iy#Od)Vl@$1rZ7!yy$GK(0SqE$2;%LFwc+8FI&QaAb1g5 zrP%WNlefYU9(~3m^blP~WqiJZkhTkF@f3FwL5EXd7w_T!4ZFkXgE#}r0}Igb#^5#2 z!zJ$ogeQ0y;eGIaIA*``u44Gk$KbAK4=WIHN8t}oPpD;93g^6wPz2RfxG#u9YS9%& zCQjz;cft+Nxyg7cLRz(YixlHE(r%J2t?R5uNw-H^)lIWiT%|pdj6}Tlh%dxlF-4tp z)=f*i-QMUmi6yRg^s1qCwQA3zVndP?MV`rv(u`_qdCf>0Qcgg zX-U;(9j^J4xC~qV1bzii{rCFx+4(@m1&#c;{UErFeSwPV{xBJ+6x<(iIkkpd-;j6h zxIGryAH+rb=NXHGcrwPm&qFmu;8!Ap=iz2J3X92={=j3*Z15nS{scp*#F1fBDV13r zF;t486iWOPh7635$wg3@xnuT9hu$vOzf@YM+O$RudrAI` x53O9r_MP00Yk)Y%OmG!;qGcx<3@_0EBclC#JhRQV(c2(%v*+x!&HV)hG0gk2nL44j>&3_dTbs-3=H`l zlN%I7CKoVXX2c>Wy?G^*9{c2AHn+*18a$I{^C(UB=2Dp~%cV4VJ*(1YefAK>$@xG| zzY@>nevUPh?*kR>W)+*s*az!G*fHO*pox+l?HmSNEbxNfCyO-p*MMgQ6i)MuxEJZ*W064Cm-T(jq diff --git a/QCflow/__pycache__/write_xTB.cpython-313.pyc b/QCflow/__pycache__/write_xTB.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f180e79bb4cd22f27a958181e962c431072c8a2 GIT binary patch literal 18423 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 Date: Mon, 2 Mar 2026 12:44:30 +0000 Subject: [PATCH 02/16] adding new psi4 job_name 'opt_pre_geom' to allow submission from previous run xyz --- QCflow/run_psi4.py | 13 +++- QCflow/write_psi4.py | 166 ++++++++++++++++++++++++++++++------------- 2 files changed, 130 insertions(+), 49 deletions(-) diff --git a/QCflow/run_psi4.py b/QCflow/run_psi4.py index 417138f..7009f82 100644 --- a/QCflow/run_psi4.py +++ b/QCflow/run_psi4.py @@ -17,6 +17,7 @@ def run_psi4(job_name, mol_name, mol_smile, time=24, cpus=10, functional='b3lyp' job_name (str): The type of job to run. Possible values: - 'sp': Single Point neutral - 'opt': Optimisation neutral + - 'opt_pre_geom': Optimisation neutral where a txt file called '{mol_name}_opt.xyz' is present in the molecule directory. This file should contain the geometry to be used for the optimisation in XYZ format. If this file is not present, the function will default to 'opt'. - 'cation': Geometry optimisation cation (opt_c) and single of neutral charge, cation geometry (n_c_geo) - 'anion': Geometry optimisation anion (opt_a) and single of neutral charge, anion geometry (n_a_geo) - 'sp_c': Single point calculation of neutral geometry at cation charge @@ -50,7 +51,14 @@ def run_psi4(job_name, mol_name, mol_smile, time=24, cpus=10, functional='b3lyp' os.mkdir(f'{mol_name}') #makes a directory for the molecule os.chdir(f'{mol_name}') #goes into directory - if (job_name=='opt') or (job_name=='sp'): + if (job_name=='opt') or (job_name=='sp') or (job_name=='opt_pre_geom'): + + if (job_name=='opt_pre_geom'): + if os.path.exists(f'{mol_name}_opt.xyz'): + print(f"Found {mol_name}_opt.xyz, using this geometry for optimisation.") + else: + print(f"{mol_name}_opt.xyz not found, defaulting to 'opt' job type.") + job_name = 'opt' #turns smiles string into rdkit object mol = Chem.MolFromSmiles(mol_smile) #gets rdkit estimated coordinates of dimer @@ -64,6 +72,9 @@ def run_psi4(job_name, mol_name, mol_smile, time=24, cpus=10, functional='b3lyp' if (job_name=='cation') or (job_name=='anion') or (job_name=='sp_c') or (job_name=='sp_a'): write_psi4_reorg(job_name, mol_name, functional, basis_set) + + else: + print(f"Invalid job_name: {job_name}, please use 'opt', 'sp', 'opt_pre_geom', 'cation', 'anion', 'sp_c' or 'sp_a'. See documentation for more details.") #writes the slurm file diff --git a/QCflow/write_psi4.py b/QCflow/write_psi4.py index 33229ba..8251646 100755 --- a/QCflow/write_psi4.py +++ b/QCflow/write_psi4.py @@ -20,7 +20,8 @@ def write_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*' ---------- job_name (str): The type of job to run. Possible values: - 'sp': Single Point neutral - - 'opt': Optimisation neutral + - 'opt': Optimisation neutral + - 'opt_pre_geom' : Optimisation neutral, from stated geometry, where a txt file called '{mol_name}_opt.xyz' is present and in psi4 format mol_name (str): The name of the molecule. smile (str): The SMILE string of the molecule. functional (str, optional): The functional to use. Default is 'b3lyp'. @@ -66,7 +67,29 @@ def write_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*' if Descriptors.NumRadicalElectrons(mol) == 1: mult_chg = '0 2' if Descriptors.NumRadicalElectrons(mol) == 2: - mult_chg = '0 3' + mult_chg = '0 3' + + if (job_name=='opt_pre_geom'): + + old_chk = ' ' + + geometry_file = f'{mol_name}_opt.xyz' + calculation = 'opt' + torsion_data = f' \n' + + if Descriptors.NumRadicalElectrons(mol) == 0: + charge = '0' + mult = '1' + mult_chg = f'{charge} {mult}' + if Descriptors.NumRadicalElectrons(mol) == 1: + charge = '0' + mult = '2' + mult_chg = f'{charge} {mult}' + if Descriptors.NumRadicalElectrons(mol) == 2: + charge = '0' + mult = '3' + mult_chg = f'{charge} {mult}' + file_name = f'{mol_name}_{job_name}.py' #Includes information about basis set to allow for ramping @@ -74,55 +97,97 @@ def write_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*' number_proc = 'set_num_threads(4)' memory_num = '4000 mb' - - with open(file_name, 'w') as file: - file.write('import psi4\n') - file.write(' \n')# - file.write(f"psi4.set_memory('{memory_num}')\n") - file.write('psi4.set_num_threads(4)\n') - file.write(' \n')# - file.write('mol_name = psi4.geometry("""\n')# - #file.write(' symmetry c1 \n') - file.write(f' {mult_chg} \n')# - # if no previous checkpoint file, get geometry - if old_chk==' ': - for atom,symbol in enumerate(symbols): - p = geometry.GetAtomPosition(atom) - # atom x y z - line = f' {symbol} {p.x:.5f} {p.y:.5f} {p.z:.5f} \n' - file.write(line) - file.write('""") \n') - file.write(' \n') - file.write("psi4.set_options({'SCF__MAXITER': 100, 'GEOM_MAXITER': 200}) \n") - file.write(f"psi4.set_options({{'basis': '{basis_set}', 'scf_type': 'df'}})\n") - file.write(' \n') - if (job_name=='sp'): - file.write(f"energy, wfn = psi4.energy('{functional}', return_wfn=True) \n") + if (job_name== 'sp') or (job_name=='opt'): + with open(file_name, 'w') as file: + file.write('import psi4\n') + file.write(' \n')# + file.write(f"psi4.set_memory('{memory_num}')\n") + file.write('psi4.set_num_threads(4)\n') + file.write(' \n')# + file.write('mol_name = psi4.geometry("""\n')# + #file.write(' symmetry c1 \n') + file.write(f' {mult_chg} \n')# + # if no previous checkpoint file, get geometry + if old_chk==' ': + for atom,symbol in enumerate(symbols): + p = geometry.GetAtomPosition(atom) + # atom x y z + line = f' {symbol} {p.x:.5f} {p.y:.5f} {p.z:.5f} \n' + file.write(line) + file.write('""") \n') file.write(' \n') - file.write("sp_geometry_xyz = wfn.molecule().to_string('xyz') \n") - file.write(f"with open('{mol_name}_{job_name}.xyz', 'w') as xyz_file:\n") - file.write(" xyz_file.write(sp_geometry_xyz) \n") - file.write(' \n') - file.write(f"psi4.core.set_active_molecule(wfn.molecule()) \n") - file.write(' \n') - file.write('orbital_energies = wfn.epsilon_a_subset("AO", "ALL").np \n') - file.write(' \n') - file.write('n_occ_alpha = wfn.nalpha() \n') - file.write('homo_energy = orbital_energies[n_occ_alpha - 1] \n') - file.write('lumo_energy = orbital_energies[n_occ_alpha] \n') - file.write('energy_gap = lumo_energy - homo_energy \n') + file.write("psi4.set_options({'SCF__MAXITER': 100, 'GEOM_MAXITER': 200}) \n") + file.write(f"psi4.set_options({{'basis': '{basis_set}', 'scf_type': 'df'}})\n") file.write(' \n') - file.write('hartree_to_ev = 27.2114079527 \n') - file.write('homo_energy_ev = homo_energy * hartree_to_ev \n') - file.write('lumo_energy_ev = lumo_energy * hartree_to_ev \n') - file.write('energy_gap_ev = lumo_energy_ev - homo_energy_ev \n') + if (job_name=='sp'): + file.write(f"energy, wfn = psi4.energy('{functional}', return_wfn=True) \n") + file.write(' \n') + file.write("sp_geometry_xyz = wfn.molecule().to_string('xyz') \n") + file.write(f"with open('{mol_name}_{job_name}.xyz', 'w') as xyz_file:\n") + file.write(" xyz_file.write(sp_geometry_xyz) \n") + file.write(' \n') + file.write(f"psi4.core.set_active_molecule(wfn.molecule()) \n") + file.write(' \n') + file.write('orbital_energies = wfn.epsilon_a_subset("AO", "ALL").np \n') + file.write(' \n') + file.write('n_occ_alpha = wfn.nalpha() \n') + file.write('homo_energy = orbital_energies[n_occ_alpha - 1] \n') + file.write('lumo_energy = orbital_energies[n_occ_alpha] \n') + file.write('energy_gap = lumo_energy - homo_energy \n') + file.write(' \n') + file.write('hartree_to_ev = 27.2114079527 \n') + file.write('homo_energy_ev = homo_energy * hartree_to_ev \n') + file.write('lumo_energy_ev = lumo_energy * hartree_to_ev \n') + file.write('energy_gap_ev = lumo_energy_ev - homo_energy_ev \n') + file.write(' \n') + file.write(f"with open('{mol_name}_{job_name}_energy_and_gap.txt', 'w') as file:\n") + file.write(' file.write(f"Optimized energy: {energy:.6f} Hatree\\n") \n') + file.write(' file.write(f"HOMO: {homo_energy_ev:.6f} eV\\n") \n') + file.write(' file.write(f"LUMO: {lumo_energy_ev:.6f} eV\\n") \n') + file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') + if (job_name=='opt'): + file.write(f"energy, wfn = psi4.optimize('{functional}', engine='geometric', return_wfn=True) \n") + file.write(' \n') + file.write("optimized_geometry_xyz = wfn.molecule().to_string('xyz') \n") + file.write(f"with open('{mol_name}_{job_name}.xyz', 'w') as xyz_file:\n") + file.write(" xyz_file.write(optimized_geometry_xyz) \n") + file.write(' \n') + file.write(f"psi4.core.set_active_molecule(wfn.molecule()) \n") + file.write(' \n') + file.write('orbital_energies = wfn.epsilon_a_subset("AO", "ALL").np \n') + file.write(' \n') + file.write('n_occ_alpha = wfn.nalpha() \n') + file.write('homo_energy = orbital_energies[n_occ_alpha - 1] \n') + file.write('lumo_energy = orbital_energies[n_occ_alpha] \n') + file.write('energy_gap = lumo_energy - homo_energy \n') + file.write(' \n') + file.write('hartree_to_ev = 27.2114079527 \n') + file.write('energy_ev = energy * hartree_to_ev \n') + file.write('homo_energy_ev = homo_energy * hartree_to_ev \n') + file.write('lumo_energy_ev = lumo_energy * hartree_to_ev \n') + file.write('energy_gap_ev = lumo_energy_ev - homo_energy_ev \n') + file.write(' \n') + file.write(f"with open('{mol_name}_{job_name}_energy_and_gap.txt', 'w') as file:\n") + file.write(' file.write(f"Optimized energy: {energy_ev:.6f} eV\\n") \n') + file.write(' file.write(f"HOMO: {homo_energy_ev:.6f} eV\\n") \n') + file.write(' file.write(f"LUMO: {lumo_energy_ev:.6f} eV\\n") \n') + file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') + file.write(' \n') + + if (job_name == 'opt_pre_geom'): + with open(file_name, 'w') as file: + file.write('import psi4\n') + file.write(' \n')# + file.write(f"psi4.set_memory('{memory_num}')\n") + file.write('psi4.set_num_threads(4)\n') + file.write(' \n')# + file.write(f"mol = psi4.geometry(open('{geometry_file}').read())\n")#use geometry from opt + file.write('psi4.core.set_active_molecule(mol)\n')#set as active molecule + file.write(f"mol.set_molecular_charge({charge}) \n")# set charge + file.write(f"mol.set_multiplicity({mult}) \n")# set multiplicity + file.write("psi4.set_options({'SCF__MAXITER': 100, 'GEOM_MAXITER': 200}) \n") + file.write(f"psi4.set_options({{'basis': '{basis_set}', 'scf_type': 'df'}})\n") file.write(' \n') - file.write(f"with open('{mol_name}_{job_name}_energy_and_gap.txt', 'w') as file:\n") - file.write(' file.write(f"Optimized energy: {energy:.6f} Hatree\\n") \n') - file.write(' file.write(f"HOMO: {homo_energy_ev:.6f} eV\\n") \n') - file.write(' file.write(f"LUMO: {lumo_energy_ev:.6f} eV\\n") \n') - file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') - if (job_name=='opt'): file.write(f"energy, wfn = psi4.optimize('{functional}', engine='geometric', return_wfn=True) \n") file.write(' \n') file.write("optimized_geometry_xyz = wfn.molecule().to_string('xyz') \n") @@ -151,6 +216,9 @@ def write_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*' file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') file.write(' \n') + else: + print(f"Invalid job_name: {job_name}, please use 'opt', 'sp' or 'opt_pre_geom'. See documentation for more details.") + def write_psi4_reorg(job_name, mol_name, functional='b3lyp', basis_set='6-31g*'): """ @@ -316,5 +384,7 @@ def write_psi4_reorg(job_name, mol_name, functional='b3lyp', basis_set='6-31g*') file.write(' file.write(f"LUMO: {lumo_energy_ev:.6f} eV\\n") \n') file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') file.write(' \n') + else: + print(f"Invalid job_name: {job_name}, please use 'cation', 'anion', 'sp_a' or 'sp_c'. See documentation for more details.") \ No newline at end of file From 9e081d87aa1670ab2eb263ce5d59933d087861b5 Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 12:48:06 +0000 Subject: [PATCH 03/16] updated version number --- docs/conf.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 5df0397..03cd8da 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -25,7 +25,7 @@ project = 'QCflow' author = 'Tristan Stephens-Jones, Micaela Matta' -release = '0.4.0' +release = '0.5.0' # -- General configuration --------------------------------------------------- diff --git a/setup.py b/setup.py index 3d3e24b..277da9b 100755 --- a/setup.py +++ b/setup.py @@ -3,6 +3,6 @@ # this can be more complicated and clever, but for now it's minimal setup( name='qcflow', - version='0.4.0', + version='0.5.0', packages=find_packages(include=['QCflow', 'QCflow.*']), ) From 14a6e5126ef43b883b2abe7dbfaa41f86131ab2e Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 12:52:42 +0000 Subject: [PATCH 04/16] building docs --- build/lib/QCflow/run_psi4.py | 13 ++- build/lib/QCflow/write_psi4.py | 166 +++++++++++++++++++++++---------- qcflow.egg-info/PKG-INFO | 2 +- 3 files changed, 131 insertions(+), 50 deletions(-) diff --git a/build/lib/QCflow/run_psi4.py b/build/lib/QCflow/run_psi4.py index 417138f..7009f82 100644 --- a/build/lib/QCflow/run_psi4.py +++ b/build/lib/QCflow/run_psi4.py @@ -17,6 +17,7 @@ def run_psi4(job_name, mol_name, mol_smile, time=24, cpus=10, functional='b3lyp' job_name (str): The type of job to run. Possible values: - 'sp': Single Point neutral - 'opt': Optimisation neutral + - 'opt_pre_geom': Optimisation neutral where a txt file called '{mol_name}_opt.xyz' is present in the molecule directory. This file should contain the geometry to be used for the optimisation in XYZ format. If this file is not present, the function will default to 'opt'. - 'cation': Geometry optimisation cation (opt_c) and single of neutral charge, cation geometry (n_c_geo) - 'anion': Geometry optimisation anion (opt_a) and single of neutral charge, anion geometry (n_a_geo) - 'sp_c': Single point calculation of neutral geometry at cation charge @@ -50,7 +51,14 @@ def run_psi4(job_name, mol_name, mol_smile, time=24, cpus=10, functional='b3lyp' os.mkdir(f'{mol_name}') #makes a directory for the molecule os.chdir(f'{mol_name}') #goes into directory - if (job_name=='opt') or (job_name=='sp'): + if (job_name=='opt') or (job_name=='sp') or (job_name=='opt_pre_geom'): + + if (job_name=='opt_pre_geom'): + if os.path.exists(f'{mol_name}_opt.xyz'): + print(f"Found {mol_name}_opt.xyz, using this geometry for optimisation.") + else: + print(f"{mol_name}_opt.xyz not found, defaulting to 'opt' job type.") + job_name = 'opt' #turns smiles string into rdkit object mol = Chem.MolFromSmiles(mol_smile) #gets rdkit estimated coordinates of dimer @@ -64,6 +72,9 @@ def run_psi4(job_name, mol_name, mol_smile, time=24, cpus=10, functional='b3lyp' if (job_name=='cation') or (job_name=='anion') or (job_name=='sp_c') or (job_name=='sp_a'): write_psi4_reorg(job_name, mol_name, functional, basis_set) + + else: + print(f"Invalid job_name: {job_name}, please use 'opt', 'sp', 'opt_pre_geom', 'cation', 'anion', 'sp_c' or 'sp_a'. See documentation for more details.") #writes the slurm file diff --git a/build/lib/QCflow/write_psi4.py b/build/lib/QCflow/write_psi4.py index 33229ba..8251646 100644 --- a/build/lib/QCflow/write_psi4.py +++ b/build/lib/QCflow/write_psi4.py @@ -20,7 +20,8 @@ def write_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*' ---------- job_name (str): The type of job to run. Possible values: - 'sp': Single Point neutral - - 'opt': Optimisation neutral + - 'opt': Optimisation neutral + - 'opt_pre_geom' : Optimisation neutral, from stated geometry, where a txt file called '{mol_name}_opt.xyz' is present and in psi4 format mol_name (str): The name of the molecule. smile (str): The SMILE string of the molecule. functional (str, optional): The functional to use. Default is 'b3lyp'. @@ -66,7 +67,29 @@ def write_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*' if Descriptors.NumRadicalElectrons(mol) == 1: mult_chg = '0 2' if Descriptors.NumRadicalElectrons(mol) == 2: - mult_chg = '0 3' + mult_chg = '0 3' + + if (job_name=='opt_pre_geom'): + + old_chk = ' ' + + geometry_file = f'{mol_name}_opt.xyz' + calculation = 'opt' + torsion_data = f' \n' + + if Descriptors.NumRadicalElectrons(mol) == 0: + charge = '0' + mult = '1' + mult_chg = f'{charge} {mult}' + if Descriptors.NumRadicalElectrons(mol) == 1: + charge = '0' + mult = '2' + mult_chg = f'{charge} {mult}' + if Descriptors.NumRadicalElectrons(mol) == 2: + charge = '0' + mult = '3' + mult_chg = f'{charge} {mult}' + file_name = f'{mol_name}_{job_name}.py' #Includes information about basis set to allow for ramping @@ -74,55 +97,97 @@ def write_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*' number_proc = 'set_num_threads(4)' memory_num = '4000 mb' - - with open(file_name, 'w') as file: - file.write('import psi4\n') - file.write(' \n')# - file.write(f"psi4.set_memory('{memory_num}')\n") - file.write('psi4.set_num_threads(4)\n') - file.write(' \n')# - file.write('mol_name = psi4.geometry("""\n')# - #file.write(' symmetry c1 \n') - file.write(f' {mult_chg} \n')# - # if no previous checkpoint file, get geometry - if old_chk==' ': - for atom,symbol in enumerate(symbols): - p = geometry.GetAtomPosition(atom) - # atom x y z - line = f' {symbol} {p.x:.5f} {p.y:.5f} {p.z:.5f} \n' - file.write(line) - file.write('""") \n') - file.write(' \n') - file.write("psi4.set_options({'SCF__MAXITER': 100, 'GEOM_MAXITER': 200}) \n") - file.write(f"psi4.set_options({{'basis': '{basis_set}', 'scf_type': 'df'}})\n") - file.write(' \n') - if (job_name=='sp'): - file.write(f"energy, wfn = psi4.energy('{functional}', return_wfn=True) \n") + if (job_name== 'sp') or (job_name=='opt'): + with open(file_name, 'w') as file: + file.write('import psi4\n') + file.write(' \n')# + file.write(f"psi4.set_memory('{memory_num}')\n") + file.write('psi4.set_num_threads(4)\n') + file.write(' \n')# + file.write('mol_name = psi4.geometry("""\n')# + #file.write(' symmetry c1 \n') + file.write(f' {mult_chg} \n')# + # if no previous checkpoint file, get geometry + if old_chk==' ': + for atom,symbol in enumerate(symbols): + p = geometry.GetAtomPosition(atom) + # atom x y z + line = f' {symbol} {p.x:.5f} {p.y:.5f} {p.z:.5f} \n' + file.write(line) + file.write('""") \n') file.write(' \n') - file.write("sp_geometry_xyz = wfn.molecule().to_string('xyz') \n") - file.write(f"with open('{mol_name}_{job_name}.xyz', 'w') as xyz_file:\n") - file.write(" xyz_file.write(sp_geometry_xyz) \n") - file.write(' \n') - file.write(f"psi4.core.set_active_molecule(wfn.molecule()) \n") - file.write(' \n') - file.write('orbital_energies = wfn.epsilon_a_subset("AO", "ALL").np \n') - file.write(' \n') - file.write('n_occ_alpha = wfn.nalpha() \n') - file.write('homo_energy = orbital_energies[n_occ_alpha - 1] \n') - file.write('lumo_energy = orbital_energies[n_occ_alpha] \n') - file.write('energy_gap = lumo_energy - homo_energy \n') + file.write("psi4.set_options({'SCF__MAXITER': 100, 'GEOM_MAXITER': 200}) \n") + file.write(f"psi4.set_options({{'basis': '{basis_set}', 'scf_type': 'df'}})\n") file.write(' \n') - file.write('hartree_to_ev = 27.2114079527 \n') - file.write('homo_energy_ev = homo_energy * hartree_to_ev \n') - file.write('lumo_energy_ev = lumo_energy * hartree_to_ev \n') - file.write('energy_gap_ev = lumo_energy_ev - homo_energy_ev \n') + if (job_name=='sp'): + file.write(f"energy, wfn = psi4.energy('{functional}', return_wfn=True) \n") + file.write(' \n') + file.write("sp_geometry_xyz = wfn.molecule().to_string('xyz') \n") + file.write(f"with open('{mol_name}_{job_name}.xyz', 'w') as xyz_file:\n") + file.write(" xyz_file.write(sp_geometry_xyz) \n") + file.write(' \n') + file.write(f"psi4.core.set_active_molecule(wfn.molecule()) \n") + file.write(' \n') + file.write('orbital_energies = wfn.epsilon_a_subset("AO", "ALL").np \n') + file.write(' \n') + file.write('n_occ_alpha = wfn.nalpha() \n') + file.write('homo_energy = orbital_energies[n_occ_alpha - 1] \n') + file.write('lumo_energy = orbital_energies[n_occ_alpha] \n') + file.write('energy_gap = lumo_energy - homo_energy \n') + file.write(' \n') + file.write('hartree_to_ev = 27.2114079527 \n') + file.write('homo_energy_ev = homo_energy * hartree_to_ev \n') + file.write('lumo_energy_ev = lumo_energy * hartree_to_ev \n') + file.write('energy_gap_ev = lumo_energy_ev - homo_energy_ev \n') + file.write(' \n') + file.write(f"with open('{mol_name}_{job_name}_energy_and_gap.txt', 'w') as file:\n") + file.write(' file.write(f"Optimized energy: {energy:.6f} Hatree\\n") \n') + file.write(' file.write(f"HOMO: {homo_energy_ev:.6f} eV\\n") \n') + file.write(' file.write(f"LUMO: {lumo_energy_ev:.6f} eV\\n") \n') + file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') + if (job_name=='opt'): + file.write(f"energy, wfn = psi4.optimize('{functional}', engine='geometric', return_wfn=True) \n") + file.write(' \n') + file.write("optimized_geometry_xyz = wfn.molecule().to_string('xyz') \n") + file.write(f"with open('{mol_name}_{job_name}.xyz', 'w') as xyz_file:\n") + file.write(" xyz_file.write(optimized_geometry_xyz) \n") + file.write(' \n') + file.write(f"psi4.core.set_active_molecule(wfn.molecule()) \n") + file.write(' \n') + file.write('orbital_energies = wfn.epsilon_a_subset("AO", "ALL").np \n') + file.write(' \n') + file.write('n_occ_alpha = wfn.nalpha() \n') + file.write('homo_energy = orbital_energies[n_occ_alpha - 1] \n') + file.write('lumo_energy = orbital_energies[n_occ_alpha] \n') + file.write('energy_gap = lumo_energy - homo_energy \n') + file.write(' \n') + file.write('hartree_to_ev = 27.2114079527 \n') + file.write('energy_ev = energy * hartree_to_ev \n') + file.write('homo_energy_ev = homo_energy * hartree_to_ev \n') + file.write('lumo_energy_ev = lumo_energy * hartree_to_ev \n') + file.write('energy_gap_ev = lumo_energy_ev - homo_energy_ev \n') + file.write(' \n') + file.write(f"with open('{mol_name}_{job_name}_energy_and_gap.txt', 'w') as file:\n") + file.write(' file.write(f"Optimized energy: {energy_ev:.6f} eV\\n") \n') + file.write(' file.write(f"HOMO: {homo_energy_ev:.6f} eV\\n") \n') + file.write(' file.write(f"LUMO: {lumo_energy_ev:.6f} eV\\n") \n') + file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') + file.write(' \n') + + if (job_name == 'opt_pre_geom'): + with open(file_name, 'w') as file: + file.write('import psi4\n') + file.write(' \n')# + file.write(f"psi4.set_memory('{memory_num}')\n") + file.write('psi4.set_num_threads(4)\n') + file.write(' \n')# + file.write(f"mol = psi4.geometry(open('{geometry_file}').read())\n")#use geometry from opt + file.write('psi4.core.set_active_molecule(mol)\n')#set as active molecule + file.write(f"mol.set_molecular_charge({charge}) \n")# set charge + file.write(f"mol.set_multiplicity({mult}) \n")# set multiplicity + file.write("psi4.set_options({'SCF__MAXITER': 100, 'GEOM_MAXITER': 200}) \n") + file.write(f"psi4.set_options({{'basis': '{basis_set}', 'scf_type': 'df'}})\n") file.write(' \n') - file.write(f"with open('{mol_name}_{job_name}_energy_and_gap.txt', 'w') as file:\n") - file.write(' file.write(f"Optimized energy: {energy:.6f} Hatree\\n") \n') - file.write(' file.write(f"HOMO: {homo_energy_ev:.6f} eV\\n") \n') - file.write(' file.write(f"LUMO: {lumo_energy_ev:.6f} eV\\n") \n') - file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') - if (job_name=='opt'): file.write(f"energy, wfn = psi4.optimize('{functional}', engine='geometric', return_wfn=True) \n") file.write(' \n') file.write("optimized_geometry_xyz = wfn.molecule().to_string('xyz') \n") @@ -151,6 +216,9 @@ def write_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*' file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') file.write(' \n') + else: + print(f"Invalid job_name: {job_name}, please use 'opt', 'sp' or 'opt_pre_geom'. See documentation for more details.") + def write_psi4_reorg(job_name, mol_name, functional='b3lyp', basis_set='6-31g*'): """ @@ -316,5 +384,7 @@ def write_psi4_reorg(job_name, mol_name, functional='b3lyp', basis_set='6-31g*') file.write(' file.write(f"LUMO: {lumo_energy_ev:.6f} eV\\n") \n') file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') file.write(' \n') + else: + print(f"Invalid job_name: {job_name}, please use 'cation', 'anion', 'sp_a' or 'sp_c'. See documentation for more details.") \ No newline at end of file diff --git a/qcflow.egg-info/PKG-INFO b/qcflow.egg-info/PKG-INFO index 7eadd1a..1b7fd78 100644 --- a/qcflow.egg-info/PKG-INFO +++ b/qcflow.egg-info/PKG-INFO @@ -1,5 +1,5 @@ Metadata-Version: 2.4 Name: qcflow -Version: 0.4.0 +Version: 0.5.0 License-File: LICENSE Dynamic: license-file From d4f98ee57d7bbf2201a4c1b5865d332fc9151d96 Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 12:55:17 +0000 Subject: [PATCH 05/16] updating psi4 readme section --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2d76b34..27abea8 100755 --- a/README.md +++ b/README.md @@ -120,6 +120,7 @@ QCflow can prepare and submit input files for the following Gaussian 16 jobs: QCflow can prepare and submit input files for the following Psi4 jobs: - Single point calculation, neutral → `sp` - Geometry optimisation, neutral → `opt` +- Geometry optimisation, neutral from txt file geometry → `opt_pre_geom` - Geometry optimisation cation (opt_c) and single of neutral charge, cation geometry (n_c_geo) → `cation` - Geometry optimisation anion (opt_a) and single of neutral charge, anion geometry (n_a_geo) → `anion` - Single point calculation, anion → `sp_a` From b2661f717b61d4991f3c0279945114f414a92b0c Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 14:39:56 +0000 Subject: [PATCH 06/16] changing docs complier to micromamba --- .github/workflows/docs_compile.yml | 33 +++++++++--------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/.github/workflows/docs_compile.yml b/.github/workflows/docs_compile.yml index 00e4583..b68afe1 100644 --- a/.github/workflows/docs_compile.yml +++ b/.github/workflows/docs_compile.yml @@ -30,37 +30,24 @@ jobs: large-packages: true docker-images: true swap-storage: true - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 + - name: Setup micromamba + uses: mamba-org/setup-micromamba@v1 with: - python-version: ${{ matrix.python-version }} - - name: Install Miniconda - uses: conda-incubator/setup-miniconda@v2 - with: - auto-update-conda: true - python-version: ${{ matrix.python-version }} - use-mamba: true - - - name: Initialize conda - shell: bash -l {0} - run: conda init bash + environment-file: QCflow.yml + environment-name: QCflow + cache-environment: true - - name: Activate conda environment, install dependencies - shell: bash -l {0} + - name: Install dependencies + shell: micromamba-shell {0} run: | - source ~/.bashrc - conda env create -f QCflow.yml - conda activate QCflow - conda install sphinx=8.2.3 + micromamba install sphinx=8.2.3 pip install sphinx_rtd_theme>=2.0.0 pip install standard-imghdr pip install . - name: Run build - shell: bash -l {0} + shell: micromamba-shell {0} run: | - source ~/.bashrc - conda activate QCflow cd docs/ make html @@ -69,4 +56,4 @@ jobs: with: publish_branch: docs github_token: ${{ secrets.qcflow2}} - publish_dir: ./docs/_build/html \ No newline at end of file + publish_dir: ./docs/_build/html From cbba79d347d6e237df67e7a47d4a0fa2706dab92 Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 14:43:21 +0000 Subject: [PATCH 07/16] test complier converted to micromamba --- .github/workflows/run_test.yml | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/.github/workflows/run_test.yml b/.github/workflows/run_test.yml index 0759137..313e508 100644 --- a/.github/workflows/run_test.yml +++ b/.github/workflows/run_test.yml @@ -11,29 +11,23 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Set up Conda - uses: conda-incubator/setup-miniconda@v2 + - name: Setup micromamba + uses: mamba-org/setup-micromamba@v1 with: - auto-activate-base: false - - name: Create and activate environment + environment-file: QCflow.yml + environment-name: QCflow + cache-environment: true + - name: Install dependencies + shell: micromamba-shell {0} run: | - conda config --add channels defaults - conda config --add channels conda-forge - conda config --add channels anaconda - conda env create -f QCflow.yml - conda init bash - source ~/.bashrc - conda activate QCflow python -m pip install --upgrade pip - python -m pip install pytest # Ensure pytest is installed + python -m pip install pytest - name: Debug Environment + shell: micromamba-shell {0} run: | - source ~/.bashrc - conda activate QCflow python --version python -m pip show pytest - name: Run Tests + shell: micromamba-shell {0} run: | - source ~/.bashrc - conda activate QCflow python -m pytest -v ./tests/test.py From 9d1d7ae9d4c352b6786317cc5f1a403f9a97c567 Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 14:52:18 +0000 Subject: [PATCH 08/16] shell error in compiling phase --- .github/workflows/docs_compile.yml | 4 ++-- .github/workflows/run_test.yml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docs_compile.yml b/.github/workflows/docs_compile.yml index b68afe1..664a292 100644 --- a/.github/workflows/docs_compile.yml +++ b/.github/workflows/docs_compile.yml @@ -38,7 +38,7 @@ jobs: cache-environment: true - name: Install dependencies - shell: micromamba-shell {0} + shell: bash -l {0} run: | micromamba install sphinx=8.2.3 pip install sphinx_rtd_theme>=2.0.0 @@ -46,7 +46,7 @@ jobs: pip install . - name: Run build - shell: micromamba-shell {0} + shell: bash -l {0} run: | cd docs/ make html diff --git a/.github/workflows/run_test.yml b/.github/workflows/run_test.yml index 313e508..7aa1fa7 100644 --- a/.github/workflows/run_test.yml +++ b/.github/workflows/run_test.yml @@ -18,16 +18,16 @@ jobs: environment-name: QCflow cache-environment: true - name: Install dependencies - shell: micromamba-shell {0} + shell: bash -l {0} run: | python -m pip install --upgrade pip python -m pip install pytest - name: Debug Environment - shell: micromamba-shell {0} + shell: bash -l {0} run: | python --version python -m pip show pytest - name: Run Tests - shell: micromamba-shell {0} + shell: bash -l {0} run: | python -m pytest -v ./tests/test.py From 119f8677fb58c8d5521a329c70539912776c33b0 Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 14:56:38 +0000 Subject: [PATCH 09/16] removing lich channel as is causing fails --- QCflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QCflow.yml b/QCflow.yml index c476a35..b2cb210 100644 --- a/QCflow.yml +++ b/QCflow.yml @@ -1,7 +1,7 @@ name: QCflow channels: - conda-forge - - lich + # - lich causing issues in instal dependencies: - brotli - brotli-bin From 2f37fe0725bc319f9403f11b1e015f2b85f4d1a3 Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 14:58:56 +0000 Subject: [PATCH 10/16] removing syba, no longer used --- QCflow.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/QCflow.yml b/QCflow.yml index b2cb210..af1fa1e 100644 --- a/QCflow.yml +++ b/QCflow.yml @@ -101,7 +101,6 @@ dependencies: - seaborn-base - six - statsmodels - - syba - tk - tornado - typing-extensions From 4b0e8c1aedec864dc70b1ae95473bc73ded7e1d0 Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 15:03:59 +0000 Subject: [PATCH 11/16] removing incorrect files --- QCflow-env.err | 7 ------- QCflow-env.out | 1 - install_pk.sh | 19 ------------------- timer.dat | 28 ---------------------------- 4 files changed, 55 deletions(-) delete mode 100644 QCflow-env.err delete mode 100644 QCflow-env.out delete mode 100644 install_pk.sh delete mode 100644 timer.dat diff --git a/QCflow-env.err b/QCflow-env.err deleted file mode 100644 index fe8c330..0000000 --- a/QCflow-env.err +++ /dev/null @@ -1,7 +0,0 @@ -warning libmamba 'repo.anaconda.com', a commercial channel hosted by Anaconda.com, is used. - -warning libmamba Please make sure you understand Anaconda Terms of Services. - -warning libmamba See: https://legal.anaconda.com/policies/en/ -micromamba: /home/conda/feedstock_root/build_artifacts/bld/rattler-build_libsolv-static_1754325691/work/src/rules.c:261: solver_addrule: Assertion `!p2 && d > 0' failed. -/var/lib/slurm/slurmd/job31669382/slurm_script: line 19: 2297279 Aborted (core dumped) $MICROMAMBA env create -f QCflow.yml -y diff --git a/QCflow-env.out b/QCflow-env.out deleted file mode 100644 index 8b13789..0000000 --- a/QCflow-env.out +++ /dev/null @@ -1 +0,0 @@ - diff --git a/install_pk.sh b/install_pk.sh deleted file mode 100644 index d6bfecd..0000000 --- a/install_pk.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=QCflow-env -#SBATCH -o QCflow-env.out -#SBATCH -e QCflow-env.err -#SBATCH -p cpu -#SBATCH --ntasks=32 -#SBATCH --nodes=1 -#SBATCH --cpus-per-task=1 -#SBATCH --mem-per-cpu=8000 -#SBATCH --time=24:00:00 -#SBATCH --mail-user=k2255489@kcl.ac.uk -#SBATCH --mail-type=BEGIN,END,FAIL - -MICROMAMBA=/cephfs/volumes/hpc_data_usr/k2255489/286fa9ad-d272-4b7d-a3ee-ccc6df026c4c/bin/micromamba -export MAMBA_ROOT_PREFIX=/cephfs/volumes/hpc_home/k2255489/6adaf325-0832-46f3-9840-3cdcb52285e8 - -eval "$($MICROMAMBA shell hook --shell=bash)" - -$MICROMAMBA env create -f QCflow.yml -y diff --git a/timer.dat b/timer.dat deleted file mode 100644 index 8166a45..0000000 --- a/timer.dat +++ /dev/null @@ -1,28 +0,0 @@ - -Host: erc-hpc-comp027 - -Timers On : Tue Apr 29 11:31:24 2025 -Timers Off: Tue Apr 29 11:31:40 2025 - -Wall Time: 16.03 seconds - - Time (seconds) -Module User System Wall Calls - --------------------------------------------------------------------------------------- - -************************************************************************************** - -Host: erc-hpc-login2 - -Timers On : Fri Sep 12 13:40:23 2025 -Timers Off: Fri Sep 12 13:40:46 2025 - -Wall Time: 23.52 seconds - - Time (seconds) -Module User System Wall Calls - --------------------------------------------------------------------------------------- - -************************************************************************************** From ea98716436ad4bdf3d1e083f39dab6bc8ffc3bfd Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 15:08:23 +0000 Subject: [PATCH 12/16] adding new torsion scan example submission --- Examples/example_torsional_scan_script.py | 43 +++++++++++++++++++++++ README.md | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 Examples/example_torsional_scan_script.py diff --git a/Examples/example_torsional_scan_script.py b/Examples/example_torsional_scan_script.py new file mode 100644 index 0000000..7872cc4 --- /dev/null +++ b/Examples/example_torsional_scan_script.py @@ -0,0 +1,43 @@ +import rdkit +from rdkit import Chem +from rdkit.Chem import Draw +from rdkit.Chem import AllChem +import numpy as np +import pandas as pd +from QCflow.load_gaussian import * +from QCflow.torsion_parser import * +from QCflow.find_torsion import * +from QCflow.write_psi4 import * +from QCflow.run_psi4 import * +from QCflow.energy_calculations import * +import os + +# This is an example for one molecule +# This can easily be converted into a loop for multiple molecules +# The getTorsion assumes single bonded but can be altered if required +# If you have more than 1 torsion or tiple, double etc bond link +# Refer to this --> https://github.com/matta-research-group/QCflow/blob/qcflow-0.5/QCflow/torsion_parser.py +# torsion_parser.py also has the scripts to extract the data you may want +# The docs --> https://matta-research-group.github.io/QCflow/ + +smiles_example = 'CC(=O)Oc1c(OC(C)=O)c(-c2c(OC(C)=O)c(OC(C)=O)cc3cc[nH]c23)c2cc[nH]c2c1' + +mol = Chem.MolFromSmiles(smiles_example) + +#adds H's and 3D coordinates +mol = embed_molecule(mol) + +#finds the rotatable bond in the molecule +bond = getBond(mol) + +#Gets the whole torsion +mol_torsions = getTorsion(mol, bond[0]) + +#writes the Gaussian input file for the torsion scan +write_gaussian('tor', 'example_mol', smiles_example, functional='B3LYP', basis_set='6-31G*', mol=mol, + torsion=mol_torsions) +#writes the SLURM script to run the Gaussian job +write_slurm('tor', 'example_mol', cpus=10) + +#submits the SLURM job, with retries in case of failure +submit_slurm_job('tor', 'example_mol', max_retries=5, wait_seconds=30) \ No newline at end of file diff --git a/README.md b/README.md index 27abea8..81832a8 100755 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![QCflow stable](https://github.com/matta-research-group/QCflow/actions/workflows/run_test.yml/badge.svg?branch=qcflow-psi4)](https://github.com/matta-research-group/QCflow/actions/workflows/run_test.yml) ![Python](https://img.shields.io/badge/language-Python-blue.svg) [![Documentation](https://img.shields.io/badge/Documentation-Online-brightgreen)](https://matta-research-group.github.io/QCflow/) -[![GitHub Last commit](https://img.shields.io/github/last-commit/matta-research-group/QCflow)](https://github.com/matta-research-group/QCflow/commits/qcflow-0.3/) +[![GitHub Last commit](https://img.shields.io/github/last-commit/matta-research-group/QCflow)](https://github.com/matta-research-group/QCflow/commits/qcflow-0.5/) [![GitHub stars](https://img.shields.io/github/stars/matta-research-group/QCflow)](https://github.com/matta-research-group/QCflow/stargazers) A cheminformatics -> quantum chemistry workflow toolkit leveraging [rdkit](https://github.com/rdkit/rdkit) and [cclib](https://github.com/cclib/cclib). From 30d9e362daf7faa4f031e5ea97b968d96a2bb12e Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 15:11:51 +0000 Subject: [PATCH 13/16] new example for psi4 --- Examples/FilteredSmilesFragments_props.csv | 111 ++++++++ ... => example_g16_calculation_submission.py} | 0 Examples/example_psi4_opt_submission.py | 0 README.md | 249 +++++++++--------- 4 files changed, 241 insertions(+), 119 deletions(-) create mode 100644 Examples/FilteredSmilesFragments_props.csv rename Examples/{example_calculation_submission.py => example_g16_calculation_submission.py} (100%) create mode 100644 Examples/example_psi4_opt_submission.py diff --git a/Examples/FilteredSmilesFragments_props.csv b/Examples/FilteredSmilesFragments_props.csv new file mode 100644 index 0000000..51abd0e --- /dev/null +++ b/Examples/FilteredSmilesFragments_props.csv @@ -0,0 +1,111 @@ +smiles,valid,mw,n_rot,n_arom,psuedo_groups,fingerprint,subset +O=C(O)C=CC1=CC=C(O)C=C1,True,164.16,1,1,COC(=O)C=Cc1ccc(O)cc1,[0. 0. 0. ... 0. 0. 0.],mono +CC1=C(Cl)C=CC=C1NC1=NC=CC=C1C(=O)O,True,262.69599999999997,3,2,COC(=O)c1cccnc1Nc1cccc(C)c1C,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)C1=CC(I)=CC(I)=C1O,True,389.914,1,1,COC(=O)c1cc(C)cc(C)c1O,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)C=CC1=CC=CC=C1O,True,164.16,1,1,COC(=O)C=Cc1ccccc1O,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)C1=CNC2=CC=CC=C12,True,161.16,1,2,COC(=O)c1cn(C)c2ccccc12,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)CC1=CNC2=CC=CC=C12,True,175.187,2,2,COC(=O)Cc1cn(C)c2ccccc12,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)C=CC1=CC=CC(O)=C1,True,164.16,1,1,COC(=O)C=Cc1cccc(O)c1,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)[C@H]1O[C@@H](OC2=CC=C(C3=COC4=CC(O)=CC=C4C3=O)C=C2)[C@H](O)[C@@H](O)[C@@H]1O,True,430.3650000000001,3,3,COC(=O)[C@H]1O[C@@H](Oc2ccc(-c3coc4cc(O)ccc4c3=O)cc2)[C@H](O)[C@@H](O)[C@@H]1O,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)[C@H]1O[C@@H](OC2=CC=C3C(=O)C(C4=CC=C(O)C=C4)=COC3=C2)[C@H](O)[C@@H](O)[C@@H]1O,True,430.36500000000007,3,3,COC(=O)[C@H]1O[C@@H](Oc2ccc3c(=O)c(-c4ccc(O)cc4)coc3c2)[C@H](O)[C@@H](O)[C@@H]1O,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)C1=C(C2=CNC3=CC=CC=C23)C(C2=CNC3=CC=CC=C23)=C(C(=O)O)N1,True,385.37900000000013,4,5,COC(=O)c1c(-c2cn(C)c3ccccc23)c(-c2cn(C)c3ccccc23)c(C(=O)OC)n1C,[0. 0. 0. ... 0. 0. 0.],mono +O=C1NC(=O)C(C2=CNC3=CC=CC=C23)=C1C1=CNC2=CC=CC=C12,True,327.3430000000001,2,4,Cn1cc(C2=C(c3cn(C)c4ccccc34)C(=O)NC2=O)c2ccccc21,[0. 0. 0. ... 0. 0. 0.],mono +O=C1NCC2=C1C1=C(NC3=CC=CC=C31)C1=C2C2=CC=CC=C2N1,True,311.344,0,5,Cn1c2ccccc2c2c3c(c4c5ccccc5n(C)c4c21)C(=O)NC3,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)CC1=CNC2=CC=C(O)C=C12,True,191.186,2,2,COC(=O)Cc1cn(C)c2ccc(O)cc12,[0. 0. 0. ... 0. 0. 0.],mono +COC1=CC=C2C(=C1)C(CC(=O)O)=C(C)N2C(=O)C1=CC=C(Cl)C=C1,True,357.793,5,3,COC(=O)Cc1c(C)n(C(=O)c2ccc(C)cc2)c2ccc(OC)cc12,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)CCC1=NC=CC2=C1NC1=CC=CC=C12,True,240.26200000000003,3,3,COC(=O)CCc1nccc2c3ccccc3n(C)c12,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)C1=CC2=CC=CC=C2N1,True,161.16,1,2,COC(=O)c1cc2ccccc2n1C,[0. 0. 0. ... 0. 0. 0.],mono +COC1=CC=C2C(=C1)NC1=C(CCC(=O)O)N=CC=C12,True,270.28799999999995,4,3,COC(=O)CCc1nccc2c3ccc(OC)cc3n(C)c12,[0. 0. 0. ... 0. 0. 0.],mono +CC#CC1=CC=C(C2=CC=C(C(=O)O)S2)S1,True,248.32799999999997,2,2,COC(=O)c1ccc(-c2ccc(C3C=CC(C)CC3C)s2)s1,[0. 0. 0. ... 0. 0. 0.],mono +O=C1NCCC2=C1NC1=CC=CC=C21,True,186.21400000000003,0,2,Cn1c2c(c3ccccc31)CCNC2=O,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)C=CC1=CC=C(O)C2=C1C=C(C1=CC=C(O)C(O)=C1)O2,True,312.27700000000004,2,3,COC(=O)C=Cc1ccc(O)c2oc(-c3ccc(O)c(O)c3)cc12,[0. 0. 0. ... 0. 0. 0.],mono +CC#CC1=CC=C(C2=CC=C(C(=O)CCl)S2)S1,True,280.80099999999993,3,2,CCC(=O)c1ccc(-c2ccc(C3CC(C)C=CC3C)s2)s1,[0. 0. 0. ... 0. 0. 0.],mono +CC#CC1=CC=C(C2=CC=C(Cl)S2)S1,True,238.76399999999998,1,2,Cc1ccc(-c2ccc(C3CC(C)C=CC3C)s2)s1,[0. 0. 0. ... 0. 0. 0.],mono +O=C(O)[C@H]1O[C@@H](OC2=CC(O)=C3C(=O)C=C(C4=CC=CC=C4)OC3=C2)[C@H](O)[C@@H](O)[C@H]1O,True,430.36500000000007,3,3,COC(=O)[C@H]1O[C@@H](Oc2cc(O)c3c(=O)cc(-c4ccccc4)oc3c2)[C@H](O)[C@@H](O)[C@H]1O,[0. 0. 0. ... 0. 0. 0.],mono +N[C@@H](CC(=O)C1=CC=CC2=C1N=C1C(=CC(=O)C3=NC(C(=O)O)=CC(O)=C13)O2)C(=O)O,True,423.33700000000016,3,2,COC(=O)c1cc(O)c2c3nc4c(C(=O)C[C@H](N)C(=O)OC)cccc4oc-3cc(=O)c2n1,[0. 1. 0. ... 0. 0. 0.],mono +COC1=CC=C(C2=CC(=O)C3=C(O)C=C(O)C=C3O2)C=C1,True,284.267,2,3,COc1ccc(-c2cc(=O)c3c(O)cc(O)cc3o2)cc1,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC2=CC=C3C=C(O)C=CC3=C2C(OC)=C1O,True,270.28399999999993,2,3,COc1cc2ccc3cc(O)ccc3c2c(OC)c1O,[0. 0. 0. ... 0. 0. 0.],di +O=C1C=C(C2=CC=CC=C2)OC2=CC(O)=CC(O)=C12,True,254.24099999999999,1,3,O=c1cc(-c2ccccc2)oc2cc(O)cc(O)c12,[0. 0. 0. ... 0. 0. 0.],di +CC1=CC(O)=CC(O)=C1,True,124.13899999999997,0,1,Cc1cc(O)cc(O)c1,[0. 0. 0. ... 0. 0. 0.],di +O=C1C=CC2=CC(O)=C(O)C=C2O1,True,178.143,0,2,O=c1ccc2cc(O)c(O)cc2o1,[0. 0. 0. ... 0. 0. 0.],di +O=C1OC2=CC(O)=CC=C2C2=C1C1=CC=C(O)C=C1O2,True,268.224,0,4,O=c1oc2cc(O)ccc2c2oc3cc(O)ccc3c12,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=C(C2=COC3=CC(O)=CC(O)=C3C2=O)C=C1,True,284.267,2,3,COc1ccc(-c2coc3cc(O)cc(O)c3c2=O)cc1,[0. 0. 0. ... 0. 0. 0.],di +NC1=NC=NC2=C1N=CN2,True,135.13,0,2,Nc1ncnc2[nH]cnc12,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC(O)=C2C(=O)OC3=CC(O)=CC(C)=C3C2=C1,True,272.256,1,3,COc1cc(O)c2c(=O)oc3cc(O)cc(C)c3c2c1,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC(O)=C2C(O)=C3C(=O)C=C(C)OC3=CC2=C1,True,272.256,1,3,COc1cc(O)c2c(O)c3c(=O)cc(C)oc3cc2c1,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC(O)=CC2=CC=C3C=C(O)C=CC3=C12,True,240.25799999999998,1,3,COc1cc(O)cc2ccc3cc(O)ccc3c12,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC=CC(O)=C1,True,110.11199999999998,0,1,Oc1cccc(O)c1,[0. 0. 0. ... 0. 0. 0.],di +O=C1C2=CC=C(O)C=C2OC2=CC=CC(O)=C12,True,228.20299999999997,0,3,O=c1c2ccc(O)cc2oc2cccc(O)c12,[0. 0. 0. ... 0. 0. 0.],di +COC1=C(O)C=CC2=C1OC1=CC=CC(O)=C1C2=O,True,258.229,1,3,COc1c(O)ccc2c(=O)c3c(O)cccc3oc12,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC2=C(C=C1O)OC1=CC=CC(O)=C1C2=O,True,258.229,1,3,COc1cc2c(=O)c3c(O)cccc3oc2cc1O,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=C(O)C2=C1OC1=CC=C(O)C=C1C2=O,True,258.229,1,3,COc1ccc(O)c2c(=O)c3cc(O)ccc3oc12,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC=CC=C1O,True,110.11199999999998,0,1,Oc1ccccc1O,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC(O)=CC(C=CC2=CC=CC=C2)=C1,True,212.248,2,2,Oc1cc(O)cc(C=Cc2ccccc2)c1,[0. 0. 0. ... 0. 0. 0.],di +O=C1OC2=CC(O)=CC=C2C2=CC=C(O)C=C12,True,228.20299999999997,0,3,O=c1oc2cc(O)ccc2c2ccc(O)cc12,[0. 0. 0. ... 0. 0. 0.],di +COC1=C(O)C=C(O)C2=C1OC(C1=CC=CC=C1)=CC2=O,True,284.267,2,3,COc1c(O)cc(O)c2c(=O)cc(-c3ccccc3)oc12,[0. 0. 0. ... 0. 0. 0.],di +COC1=C(O)C=C2OC(C3=CC=CC=C3)=CC(=O)C2=C1O,True,284.267,2,3,COc1c(O)cc2oc(-c3ccccc3)cc(=O)c2c1O,[0. 0. 0. ... 0. 0. 0.],di +O=C1N=CNC2=C1NC=N2,True,136.11399999999998,0,2,O=c1nc[nH]c2nc[nH]c12,[0. 0. 0. ... 0. 0. 0.],di +CC1=CC2=NC3=C(N=C2C=C1C)C(=O)NC(=O)N3,True,242.23800000000003,0,3,Cc1cc2nc3[nH]c(=O)[nH]c(=O)c3nc2cc1C,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC2=C(C(O)=C1O)C(=O)C=C(C1=CC=CC=C1)O2,True,284.267,2,3,COc1cc2oc(-c3ccccc3)cc(=O)c2c(O)c1O,[0. 0. 0. ... 0. 0. 0.],di +O=C1C(C2=CC=C3OCOC3=C2)=COC2=CC(O)=CC(O)=C12,True,298.25,1,3,O=c1c(-c2ccc3c(c2)OCO3)coc2cc(O)cc(O)c12,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=C2OC3=CC(O)=CC(O)=C3C(=O)C2=C1,True,258.229,1,3,COc1ccc2oc3cc(O)cc(O)c3c(=O)c2c1,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC(O)=C2C(=O)C(O)=C(C3=CC=CC=C3)OC2=C1,True,284.26700000000005,2,3,COc1cc(O)c2c(=O)c(O)c(-c3ccccc3)oc2c1,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC(O)=C2C(=O)C3=C(C)C=C(O)C=C3OC2=C1,True,272.256,1,3,COc1cc(O)c2c(=O)c3c(C)cc(O)cc3oc2c1,[0. 0. 0. ... 0. 0. 0.],di +NC1=CC(Cl)=CC(Cl)=N1,True,163.007,0,1,Cc1cc(C)nc(N)c1,[0. 0. 0. ... 0. 0. 0.],di +O=C1C=CC2=C(O)C=C(O)C=C2O1,True,178.143,0,2,O=c1ccc2c(O)cc(O)cc2o1,[0. 0. 0. ... 0. 0. 0.],di +CC1=C(O)C=C(CCC2=CC=CC=C2)C=C1O,True,228.29100000000003,3,2,Cc1c(O)cc(CCc2ccccc2)cc1O,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=C2C=CC(=O)OC2=C1OC1=C(O)C=C(O)C2=C1OC(=O)C=C2,True,368.2970000000001,3,4,COc1ccc2ccc(=O)oc2c1Oc1c(O)cc(O)c2ccc(=O)oc12,[0. 0. 0. ... 0. 0. 0.],di +O=C1C=C(C2=CC=CC=C2)C2=CC(O)=C(O)C=C2O1,True,254.24099999999999,1,3,O=c1cc(-c2ccccc2)c2cc(O)c(O)cc2o1,[0. 0. 0. ... 0. 0. 0.],di +O=C1C=CC2=CC=C(O)C(O)=C2O1,True,178.14299999999997,0,2,O=c1ccc2ccc(O)c(O)c2o1,[0. 0. 0. ... 0. 0. 0.],di +ClC1=CC=C(Cl)C=C1,True,147.00400000000002,0,1,Cc1ccc(C)cc1,[0. 0. 0. ... 0. 0. 0.],di +ClC1=CC=CC=C1Cl,True,147.00399999999996,0,1,Cc1ccccc1C,[0. 0. 0. ... 0. 0. 0.],di +CC1=CNN=C1,True,82.106,0,1,Cc1cn[nH]c1,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC(O)=CC(C2=CC3=CC4=C(C=C3O2)OC=C4)=C1,True,266.25199999999995,1,4,Oc1cc(O)cc(-c2cc3cc4ccoc4cc3o2)c1,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC(O)=C2C(=O)C3=CC=CC(O)=C3OC2=C1,True,258.229,1,3,COc1cc(O)c2c(=O)c3cccc(O)c3oc2c1,[0. 0. 0. ... 0. 0. 0.],di +C=CC1=CC(O)=CC2=CC=C3C(C)=C(O)C=CC3=C12,True,250.29699999999997,1,3,C=Cc1cc(O)cc2ccc3c(C)c(O)ccc3c12,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC(O)=C2C=CC=CC2=C1,True,160.17199999999997,0,2,Oc1cc(O)c2ccccc2c1,[0. 0. 0. ... 0. 0. 0.],di +O=C1C2=CC(O)=CC=C2OC2=CC3=C(OCO3)C(O)=C12,True,272.21199999999993,0,3,O=c1c2cc(O)ccc2oc2cc3c(c(O)c12)OCO3,[0. 0. 0. ... 0. 0. 0.],di +COC1=C(O)C=C2C=CC3=CC(O)=CC=C3C2=C1OC,True,270.284,2,3,COc1c(O)cc2ccc3cc(O)ccc3c2c1OC,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC(O)=CC2=CC=C3C=CC=C(O)C3=C12,True,240.25799999999998,1,3,COc1cc(O)cc2ccc3cccc(O)c3c12,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=C(C2=COC3=CC(O)=C(O)C=C3C2=O)C=C1,True,284.267,2,3,COc1ccc(-c2coc3cc(O)c(O)cc3c2=O)cc1,[0. 0. 0. ... 0. 0. 0.],di +O=C1C=C(C2=CC=CC=C2)OC2=C(O)C=CC(O)=C12,True,254.24099999999999,1,3,O=c1cc(-c2ccccc2)oc2c(O)ccc(O)c12,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=C(OC2=CC(=O)C3=C(O)C=C(O)C=C3O2)C=C1,True,300.266,3,3,COc1ccc(Oc2cc(=O)c3c(O)cc(O)cc3o2)cc1,[0. 0. 0. ... 0. 0. 0.],di +O=C1C2=CC=CC=C2C(=O)C2=C1C=C(O)C(CC1=CC=CC=C1)=C2O,True,330.339,2,3,O=C1c2ccccc2C(=O)c2c1cc(O)c(Cc1ccccc1)c2O,[0. 1. 0. ... 0. 0. 0.],di +OC1=CC=C(O)C=C1,True,110.11199999999998,0,1,Oc1ccc(O)cc1,[0. 0. 0. ... 0. 0. 0.],di +CC1=CC=C(O)C(O)=C1,True,124.13899999999998,0,1,Cc1ccc(O)c(O)c1,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=CC=C1C1=COC2=CC(O)=C(C)C(O)=C2C1=O,True,298.29400000000004,2,3,COc1ccccc1-c1coc2cc(O)c(C)c(O)c2c1=O,[0. 0. 0. ... 0. 0. 0.],di +C=CC1=C(C)C(O)=CC2=CC=C3C(C)=C(O)C=CC3=C12,True,264.324,1,3,C=Cc1c(C)c(O)cc2ccc3c(C)c(O)ccc3c12,[0. 0. 0. ... 0. 0. 0.],di +O=C1C=C(CCC2=CC=CC=C2)OC2=C(O)C=CC(O)=C12,True,282.295,3,3,O=c1cc(CCc2ccccc2)oc2c(O)ccc(O)c12,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC=C(O)C2=CC=CC=C12,True,160.172,0,2,Oc1ccc(O)c2ccccc12,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC(O)=CC(CCC2=CC=CC=C2)=C1,True,214.264,3,2,Oc1cc(O)cc(CCc2ccccc2)c1,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC(O)=C2OC3=CC=CC=C3CCC2=C1,True,228.24699999999996,0,2,Oc1cc(O)c2c(c1)CCc1ccccc1O2,[0. 0. 0. ... 0. 0. 0.],di +CC1=CC(O)=CC=C1O,True,124.13899999999997,0,1,Cc1cc(O)ccc1O,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC(O)=C2C(=C1)C=CC1=CC(O)=CC=C12,True,240.258,1,3,COc1cc(O)c2c(ccc3cc(O)ccc32)c1,[0. 0. 0. ... 0. 0. 0.],di +COC1=C(O)C=C2OC3=CC=CC=C3C(=O)C2=C1O,True,258.229,1,3,COc1c(O)cc2oc3ccccc3c(=O)c2c1O,[0. 0. 0. ... 0. 0. 0.],di +CC1=CC=CC(O)=C1O,True,124.13899999999998,0,1,Cc1cccc(O)c1O,[0. 0. 0. ... 0. 0. 0.],di +O=C1OC2=CC(O)=C(O)C=C2C2=C1C1=CC=CC=C1O2,True,268.224,0,4,O=c1oc2cc(O)c(O)cc2c2oc3ccccc3c12,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC2=CC=C3C=C(O)C=CC3=C2C(O)=C1OC,True,270.284,2,3,COc1cc2ccc3cc(O)ccc3c2c(O)c1OC,[0. 0. 0. ... 0. 0. 0.],di +NC1=NC=NC2=C1NC=N2,True,135.12999999999997,0,2,Nc1ncnc2nc[nH]c12,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=C(C2=COC3=C(O)C(O)=CC=C3C2=O)C=C1,True,284.267,2,3,COc1ccc(-c2coc3c(O)c(O)ccc3c2=O)cc1,[0. 0. 0. ... 0. 0. 0.],di +CC1=CC(=O)OC2=CC(O)=C(O)C=C12,True,192.17,0,2,Cc1cc(=O)oc2cc(O)c(O)cc12,[0. 0. 0. ... 0. 0. 0.],di +CC1=C(O)C=C(C=CC2=CC=CC=C2)C=C1O,True,226.275,2,2,Cc1c(O)cc(C=Cc2ccccc2)cc1O,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC=C2C=CC=CC2=C1O,True,160.17199999999997,0,2,Oc1ccc2ccccc2c1O,[0. 0. 0. ... 0. 0. 0.],di +OC1=CN=C2C(O)=CC=CC2=C1,True,161.15999999999997,0,2,Oc1cnc2c(O)cccc2c1,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC2=C(C=C1O)NC=C2,True,149.149,0,2,Cn1ccc2cc(O)c(O)cc21,[0. 0. 0. ... 0. 0. 0.],di +O=C1C(C2=CC=CC=C2)=COC2=CC(O)=CC(O)=C12,True,254.24099999999996,1,3,O=c1c(-c2ccccc2)coc2cc(O)cc(O)c12,[0. 0. 0. ... 0. 0. 0.],di +O=C1C=C(C2=CC=CC=C2)C2=CC=C(O)C(O)=C2O1,True,254.24099999999999,1,3,O=c1cc(-c2ccccc2)c2ccc(O)c(O)c2o1,[0. 0. 0. ... 0. 0. 0.],di +CC1=C(O)C=CC2=C1C=CC1=CC(O)=CC(C=O)=C12,True,252.26899999999998,1,3,Cc1c(O)ccc2c1ccc1cc(O)cc(C=O)c12,[0. 0. 0. ... 0. 0. 0.],di +COC1=C(O)C=CC2=C1OC(=O)C1=C2OC2=CC(O)=CC=C21,True,298.24999999999994,1,4,COc1c(O)ccc2c1oc(=O)c1c3ccc(O)cc3oc21,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=C2C(=C1)OCC1=C2OC2=CC(O)=C(O)C=C12,True,284.267,1,3,COc1ccc2c(c1)OCc1c-2oc2cc(O)c(O)cc12,[0. 0. 0. ... 0. 0. 0.],di +CC1=C(O)C=C(C2=CC3=CC=CC=C3O2)C=C1O,True,240.258,1,3,Cc1c(O)cc(-c2cc3ccccc3o2)cc1O,[0. 0. 0. ... 0. 0. 0.],di +CC1=C(O)C(C=O)=C2OC(C3=CC=CC=C3)=CC(=O)C2=C1O,True,296.278,2,3,Cc1c(O)c(C=O)c2oc(-c3ccccc3)cc(=O)c2c1O,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=C(O)C2=C1OC1=CC(C)=CC(O)=C1C2=O,True,272.25600000000003,1,3,COc1ccc(O)c2c(=O)c3c(O)cc(C)cc3oc12,[0. 0. 0. ... 0. 0. 0.],di +COC1=C(C)C(O)=C2C(=O)C=C(C3=CC=CC=C3)OC2=C1O,True,298.29400000000004,2,3,COc1c(C)c(O)c2c(=O)cc(-c3ccccc3)oc2c1O,[0. 0. 0. ... 0. 0. 0.],di +COC1=C(O)C=C2C(=O)OC3=CC(O)=CC4=CC=C1C2=C43,True,282.25100000000003,1,4,COc1c(O)cc2c(=O)oc3cc(O)cc4ccc1c2c43,[0. 0. 0. ... 0. 0. 0.],di +CC1=CC2=C(C(=O)O1)C1=CC(O)=C(O)C=C1C(=O)O2,True,260.201,0,3,Cc1cc2oc(=O)c3cc(O)c(O)cc3c2c(=O)o1,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC=C2C(O)=CC=CC2=C1,True,160.172,0,2,Oc1ccc2c(O)cccc2c1,[0. 0. 0. ... 0. 0. 0.],di +O=C1C=C(CCC2=CC=CC=C2)OC2=C(O)C=C(O)C=C12,True,282.295,3,3,O=c1cc(CCc2ccccc2)oc2c(O)cc(O)cc12,[0. 0. 0. ... 0. 0. 0.],di +COC1=CC=C2C(=C1)OC1=C2C(=O)OC2=CC(O)=C(O)C=C21,True,298.25,1,4,COc1ccc2c(c1)oc1c3cc(O)c(O)cc3oc(=O)c21,[0. 0. 0. ... 0. 0. 0.],di +NC1=NC=C2N=C(O)C=NC2=N1,True,163.14,0,2,Nc1ncc2nc(O)cnc2n1,[0. 0. 0. ... 0. 0. 0.],di +COC1=C(O)C=CC2=C1C(=O)C1=CC(O)=CC=C1O2,True,258.229,1,3,COc1c(O)ccc2oc3ccc(O)cc3c(=O)c12,[0. 0. 0. ... 0. 0. 0.],di +OC1=CC=C2C=C(O)C=CC2=C1,True,160.172,0,2,Oc1ccc2cc(O)ccc2c1,[0. 0. 0. ... 0. 0. 0.],di diff --git a/Examples/example_calculation_submission.py b/Examples/example_g16_calculation_submission.py similarity index 100% rename from Examples/example_calculation_submission.py rename to Examples/example_g16_calculation_submission.py diff --git a/Examples/example_psi4_opt_submission.py b/Examples/example_psi4_opt_submission.py new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index 81832a8..87665e2 100755 --- a/README.md +++ b/README.md @@ -136,80 +136,9 @@ Additionally, we welcome any developments and improvements user may have and if ```bash . -├── Examples -│   ├── example_calculation_submission.py -│   ├── example_data_extraction.ipynb -│   ├── example_data_extraction_bulk.py -│   ├── example_molecule_building.ipynb -│   └── example_molecule_logs -│   ├── 18 -│   │   └── 18_opt.log -│   ├── b -│   │   └── b_opt.log -│   └── b_18_single_v2 -│   ├── b_18_single_v2_n_a_geo.log -│   ├── b_18_single_v2_n_c_geo.log -│   ├── b_18_single_v2_opt.log -│   ├── b_18_single_v2_opt_a.log -│   ├── b_18_single_v2_opt_c.log -│   ├── b_18_single_v2_sp_a.log -│   └── b_18_single_v2_sp_c.log -├── LICENSE -├── QCflow -│   ├── __init__.py -│   ├── __pycache__ -│   │   ├── __init__.cpython-311.pyc -│   │   ├── __init__.cpython-313.pyc -│   │   ├── __init__.cpython-38.pyc -│   │   ├── __init__.cpython-39.pyc -│   │   ├── energy_calculations.cpython-313.pyc -│   │   ├── find_torsion.cpython-311.pyc -│   │   ├── find_torsion.cpython-313.pyc -│   │   ├── find_torsion.cpython-39.pyc -│   │   ├── fragments.cpython-311.pyc -│   │   ├── fragments.cpython-313.pyc -│   │   ├── fragments.cpython-38.pyc -│   │   ├── fragments.cpython-39.pyc -│   │   ├── load_gaussian.cpython-311.pyc -│   │   ├── load_gaussian.cpython-313.pyc -│   │   ├── load_gaussian.cpython-39.pyc -│   │   ├── run_gaussian.cpython-313.pyc -│   │   ├── run_opt_neutral.cpython-311.pyc -│   │   ├── run_opt_neutral.cpython-39.pyc -│   │   ├── run_opt_set_dihedral.cpython-311.pyc -│   │   ├── run_psi4.cpython-313.pyc -│   │   ├── sa_score.cpython-313.pyc -│   │   ├── slurm.cpython-311.pyc -│   │   ├── slurm.cpython-313.pyc -│   │   ├── slurm.cpython-39.pyc -│   │   ├── testing_data.cpython-313.pyc -│   │   ├── torsion_parser.cpython-311.pyc -│   │   ├── torsion_parser.cpython-313.pyc -│   │   ├── torsion_parser.cpython-39.pyc -│   │   ├── torsion_run.cpython-311.pyc -│   │   ├── torsion_run.cpython-39.pyc -│   │   ├── write_gaussian.cpython-311.pyc -│   │   ├── write_gaussian.cpython-313.pyc -│   │   ├── write_gaussian.cpython-39.pyc -│   │   └── write_psi4.cpython-313.pyc -│   ├── energy_calculations.py -│   ├── find_torsion.py -│   ├── fragments.py -│   ├── future_functions -│   │   └── orbital_parse.py -│   ├── load_gaussian.py -│   ├── run_gaussian.py -│   ├── run_psi4.py -│   ├── sa_score.py -│   ├── slurm.py -│   ├── testing_data.py -│   ├── torsion_parser.py -│   ├── write_gaussian.py -│   └── write_psi4.py -├── QCflow.yml -├── QCflow_logo_narrow.jpg -├── README.md ├── build +│   ├── bdist.linux-x86_64 +│   ├── bdist.macosx-11.0-arm64 │   └── lib │   └── QCflow │   ├── __init__.py @@ -219,15 +148,15 @@ Additionally, we welcome any developments and improvements user may have and if │   ├── load_gaussian.py │   ├── run_gaussian.py │   ├── run_psi4.py +│   ├── run_xTB.py │   ├── sa_score.py │   ├── slurm.py │   ├── testing_data.py │   ├── torsion_parser.py │   ├── write_gaussian.py -│   └── write_psi4.py +│   ├── write_psi4.py +│   └── write_xTB.py ├── docs -│   ├── Makefile -│   ├── README.md │   ├── _build │   │   ├── doctrees │   │   │   ├── api.doctree @@ -236,35 +165,30 @@ Additionally, we welcome any developments and improvements user may have and if │   │   │   └── index.doctree │   │   └── html │   │   ├── _modules -│   │   │   ├── QCflow -│   │   │   │   ├── energy_calculations.html -│   │   │   │   ├── find_torsion.html -│   │   │   │   ├── fragments.html -│   │   │   │   ├── load_gaussian.html -│   │   │   │   ├── run_gaussian.html -│   │   │   │   ├── run_psi4.html -│   │   │   │   ├── sa_score.html -│   │   │   │   ├── slurm.html -│   │   │   │   ├── testing_data.html -│   │   │   │   ├── torsion_parser.html -│   │   │   │   ├── write_gaussian.html -│   │   │   │   └── write_psi4.html -│   │   │   └── index.html +│   │   │   ├── index.html +│   │   │   └── QCflow +│   │   │   ├── energy_calculations.html +│   │   │   ├── find_torsion.html +│   │   │   ├── fragments.html +│   │   │   ├── load_gaussian.html +│   │   │   ├── run_gaussian.html +│   │   │   ├── run_psi4.html +│   │   │   ├── sa_score.html +│   │   │   ├── slurm.html +│   │   │   ├── testing_data.html +│   │   │   ├── torsion_parser.html +│   │   │   ├── write_gaussian.html +│   │   │   └── write_psi4.html │   │   ├── _sources │   │   │   ├── api.rst.txt │   │   │   ├── getting_started.rst.txt │   │   │   └── index.rst.txt │   │   ├── _static -│   │   │   ├── README.md │   │   │   ├── _sphinx_javascript_frameworks_compat.js │   │   │   ├── basic.css │   │   │   ├── css │   │   │   │   ├── badge_only.css │   │   │   │   ├── fonts -│   │   │   │   │   ├── Roboto-Slab-Bold.woff -│   │   │   │   │   ├── Roboto-Slab-Bold.woff2 -│   │   │   │   │   ├── Roboto-Slab-Regular.woff -│   │   │   │   │   ├── Roboto-Slab-Regular.woff2 │   │   │   │   │   ├── fontawesome-webfont.eot │   │   │   │   │   ├── fontawesome-webfont.svg │   │   │   │   │   ├── fontawesome-webfont.ttf @@ -277,7 +201,11 @@ Additionally, we welcome any developments and improvements user may have and if │   │   │   │   │   ├── lato-normal-italic.woff │   │   │   │   │   ├── lato-normal-italic.woff2 │   │   │   │   │   ├── lato-normal.woff -│   │   │   │   │   └── lato-normal.woff2 +│   │   │   │   │   ├── lato-normal.woff2 +│   │   │   │   │   ├── Roboto-Slab-Bold.woff +│   │   │   │   │   ├── Roboto-Slab-Bold.woff2 +│   │   │   │   │   ├── Roboto-Slab-Regular.woff +│   │   │   │   │   └── Roboto-Slab-Regular.woff2 │   │   │   │   └── theme.css │   │   │   ├── doctools.js │   │   │   ├── documentation_options.js @@ -318,6 +246,7 @@ Additionally, we welcome any developments and improvements user may have and if │   │   │   ├── minus.png │   │   │   ├── plus.png │   │   │   ├── pygments.css +│   │   │   ├── README.md │   │   │   ├── searchtools.js │   │   │   └── sphinx_highlight.js │   │   ├── api.html @@ -337,15 +266,102 @@ Additionally, we welcome any developments and improvements user may have and if │   ├── getting_started.rst │   ├── index.rst │   ├── make.bat +│   ├── Makefile +│   ├── README.md │   ├── requirements.yaml │   └── timer.dat +├── Examples +│   ├── example_data_extraction_bulk.py +│   ├── example_data_extraction.ipynb +│   ├── example_g16_calculation_submission.py +│   ├── example_molecule_building.ipynb +│   ├── example_molecule_logs +│   │   ├── 18 +│   │   │   └── 18_opt.log +│   │   ├── b +│   │   │   └── b_opt.log +│   │   └── b_18_single_v2 +│   │   ├── b_18_single_v2_n_a_geo.log +│   │   ├── b_18_single_v2_n_c_geo.log +│   │   ├── b_18_single_v2_opt_a.log +│   │   ├── b_18_single_v2_opt_c.log +│   │   ├── b_18_single_v2_opt.log +│   │   ├── b_18_single_v2_sp_a.log +│   │   └── b_18_single_v2_sp_c.log +│   ├── example_psi4_opt_submission.py +│   ├── example_torsional_scan_script.py +│   └── FilteredSmilesFragments_props.csv +├── LICENSE +├── QCflow +│   ├── __init__.py +│   ├── __pycache__ +│   │   ├── __init__.cpython-311.pyc +│   │   ├── __init__.cpython-313.pyc +│   │   ├── __init__.cpython-38.pyc +│   │   ├── __init__.cpython-39.pyc +│   │   ├── energy_calculations.cpython-313.pyc +│   │   ├── find_torsion.cpython-311.pyc +│   │   ├── find_torsion.cpython-313.pyc +│   │   ├── find_torsion.cpython-39.pyc +│   │   ├── fragments.cpython-311.pyc +│   │   ├── fragments.cpython-313.pyc +│   │   ├── fragments.cpython-38.pyc +│   │   ├── fragments.cpython-39.pyc +│   │   ├── load_gaussian.cpython-311.pyc +│   │   ├── load_gaussian.cpython-313.pyc +│   │   ├── load_gaussian.cpython-39.pyc +│   │   ├── run_gaussian.cpython-313.pyc +│   │   ├── run_opt_neutral.cpython-311.pyc +│   │   ├── run_opt_neutral.cpython-39.pyc +│   │   ├── run_opt_set_dihedral.cpython-311.pyc +│   │   ├── run_psi4.cpython-313.pyc +│   │   ├── run_xTB.cpython-313.pyc +│   │   ├── sa_score.cpython-313.pyc +│   │   ├── slurm.cpython-311.pyc +│   │   ├── slurm.cpython-313.pyc +│   │   ├── slurm.cpython-39.pyc +│   │   ├── testing_data.cpython-313.pyc +│   │   ├── torsion_parser.cpython-311.pyc +│   │   ├── torsion_parser.cpython-313.pyc +│   │   ├── torsion_parser.cpython-39.pyc +│   │   ├── torsion_run.cpython-311.pyc +│   │   ├── torsion_run.cpython-39.pyc +│   │   ├── write_gaussian.cpython-311.pyc +│   │   ├── write_gaussian.cpython-313.pyc +│   │   ├── write_gaussian.cpython-39.pyc +│   │   ├── write_psi4.cpython-313.pyc +│   │   └── write_xTB.cpython-313.pyc +│   ├── energy_calculations.py +│   ├── find_torsion.py +│   ├── fragments.py +│   ├── future_functions +│   │   └── orbital_parse.py +│   ├── load_gaussian.py +│   ├── run_gaussian.py +│   ├── run_psi4.py +│   ├── run_xTB.py +│   ├── sa_score.py +│   ├── slurm.py +│   ├── testing_data.py +│   ├── torsion_parser.py +│   ├── write_gaussian.py +│   ├── write_psi4.py +│   └── write_xTB.py +├── QCflow_logo_narrow.jpg ├── qcflow.egg-info +│   ├── dependency_links.txt │   ├── PKG-INFO │   ├── SOURCES.txt -│   ├── dependency_links.txt │   └── top_level.txt +├── QCflow.yml +├── README.md ├── setup.py └── tests + ├── __pycache__ + │   ├── test.cpython-313-pytest-7.4.4.pyc + │   ├── test.cpython-313-pytest-8.3.3.pyc + │   ├── tests.cpython-312-pytest-7.4.4.pyc + │   └── tests.cpython-312.pyc ├── 1 │   ├── 1_cation.py │   ├── 1_opt.py @@ -361,26 +377,26 @@ Additionally, we welcome any developments and improvements user may have and if │   ├── 12_cation.sh │   ├── 12_n_a_geo_energy_and_gap.txt │   ├── 12_n_c_geo_energy_and_gap.txt + │   ├── 12_opt_a_energy_and_gap.txt + │   ├── 12_opt_a.xyz + │   ├── 12_opt_c_energy_and_gap.txt + │   ├── 12_opt_c.xyz + │   ├── 12_opt_energy_and_gap.txt │   ├── 12_opt.err │   ├── 12_opt.out │   ├── 12_opt.py │   ├── 12_opt.sh │   ├── 12_opt.xyz - │   ├── 12_opt_a.xyz - │   ├── 12_opt_a_energy_and_gap.txt - │   ├── 12_opt_c.xyz - │   ├── 12_opt_c_energy_and_gap.txt - │   ├── 12_opt_energy_and_gap.txt + │   ├── 12_sp_a_energy_and_gap.txt │   ├── 12_sp_a.err │   ├── 12_sp_a.out │   ├── 12_sp_a.py │   ├── 12_sp_a.sh - │   ├── 12_sp_a_energy_and_gap.txt + │   ├── 12_sp_c_energy_and_gap.txt │   ├── 12_sp_c.err │   ├── 12_sp_c.out │   ├── 12_sp_c.py │   ├── 12_sp_c.sh - │   ├── 12_sp_c_energy_and_gap.txt │   └── timer.dat ├── 145 │   ├── 145_anion.err @@ -393,48 +409,43 @@ Additionally, we welcome any developments and improvements user may have and if │   ├── 145_cation.sh │   ├── 145_n_a_geo_energy_and_gap.txt │   ├── 145_n_c_geo_energy_and_gap.txt + │   ├── 145_opt_a_energy_and_gap.txt + │   ├── 145_opt_a.xyz + │   ├── 145_opt_c_energy_and_gap.txt + │   ├── 145_opt_c.xyz + │   ├── 145_opt_energy_and_gap.txt │   ├── 145_opt.err │   ├── 145_opt.out │   ├── 145_opt.py │   ├── 145_opt.sh │   ├── 145_opt.xyz - │   ├── 145_opt_a.xyz - │   ├── 145_opt_a_energy_and_gap.txt - │   ├── 145_opt_c.xyz - │   ├── 145_opt_c_energy_and_gap.txt - │   ├── 145_opt_energy_and_gap.txt + │   ├── 145_sp_a_energy_and_gap.txt │   ├── 145_sp_a.err │   ├── 145_sp_a.out │   ├── 145_sp_a.py │   ├── 145_sp_a.sh - │   ├── 145_sp_a_energy_and_gap.txt + │   ├── 145_sp_c_energy_and_gap.txt │   ├── 145_sp_c.err │   ├── 145_sp_c.out │   ├── 145_sp_c.py │   ├── 145_sp_c.sh - │   ├── 145_sp_c_energy_and_gap.txt │   └── timer.dat - ├── __pycache__ - │   ├── test.cpython-313-pytest-7.4.4.pyc - │   ├── test.cpython-313-pytest-8.3.3.pyc - │   ├── tests.cpython-312-pytest-7.4.4.pyc - │   └── tests.cpython-312.pyc ├── b_18_v2 │   ├── b_18_v2_n_a_geo.log │   ├── b_18_v2_n_c_geo.log + │   ├── b_18_v2_opt_a.log + │   ├── b_18_v2_opt_c.log │   ├── b_18_v2_opt.com │   ├── b_18_v2_opt.log │   ├── b_18_v2_opt.sh - │   ├── b_18_v2_opt_a.log - │   ├── b_18_v2_opt_c.log │   ├── b_18_v2_sp_a.log │   ├── b_18_v2_sp_c.log │   ├── b_18_v2_sp_hirsh.log │   └── b_18_v2_tor.log ├── example_dic.json ├── fake_dict.json - ├── test.py ├── test_dict.json + ├── test.py ├── timer.dat └── torsion_1 └── torsion_1_tor.log From ca4ca26d29124c15c91b0481d9cb3945577b9f9b Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 15:42:41 +0000 Subject: [PATCH 14/16] adding xTB to documentation --- build/lib/QCflow/write_psi4.py | 0 docs/api.rst | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) mode change 100644 => 100755 build/lib/QCflow/write_psi4.py diff --git a/build/lib/QCflow/write_psi4.py b/build/lib/QCflow/write_psi4.py old mode 100644 new mode 100755 diff --git a/docs/api.rst b/docs/api.rst index 05811a5..2c78cec 100755 --- a/docs/api.rst +++ b/docs/api.rst @@ -35,6 +35,15 @@ QCflow.write_psi4 :show-inheritance: :no-imported-members: +QCflow.write_xTB +===================== + +.. automodule:: QCflow.write_xTB + :members: + :undoc-members: + :show-inheritance: + :no-imported-members: + QCflow.slurm ============ @@ -62,6 +71,15 @@ QCflow.run_psi4 :show-inheritance: :no-imported-members: +QCflow.run_xTB +=================== + +.. automodule:: QCflow.run_xTB + :members: + :undoc-members: + :show-inheritance: + :no-imported-members: + QCflow.testing_data =================== From e6ca56630f88eabebbff9d01fbd6d5bbcf5ee6cf Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Mon, 2 Mar 2026 15:54:31 +0000 Subject: [PATCH 15/16] updating xTB docstrings --- QCflow/write_xTB.py | 45 +++++++++++++++++++++++++++++++++- build/lib/QCflow/write_xTB.py | 46 ++++++++++++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/QCflow/write_xTB.py b/QCflow/write_xTB.py index af78cb6..e921a22 100644 --- a/QCflow/write_xTB.py +++ b/QCflow/write_xTB.py @@ -11,7 +11,22 @@ import tempfile def run_xtb_optimisation(xyz: str, output_file: str, charge=0, uhf=0, gfn=2): - """Run xTB geometry optimisation using GFN2-xTB and save to output_file.""" + """ + Runs a xTB geometry optimisation using GFN2-xTB and saves the result to output_file. + + Parameters + ---------- + xyz (str): The input geometry in XYZ format as a string. + output_file (str): The path to the file where the optimised geometry will be saved + charge (int, optional): The total charge of the system. Default is 0. + uhf (int, optional): The number of unpaired electrons (spin multiplicity - 1). Default is 0 (singlet). + gfn (int, optional): The GFN-xTB method to use (1, 2, or 3). Default is 2 (GFN2-xTB). + + Returns + ------- + None: Writes the optimised geometry to output_file. + + """ with tempfile.TemporaryDirectory() as tmpdir: xyz_path = os.path.join(tmpdir, "input.xyz") with open(xyz_path, 'w') as f: @@ -43,6 +58,17 @@ def run_xtb_optimisation(xyz: str, output_file: str, charge=0, uhf=0, gfn=2): print(f"Optimised structure saved to: {output_file}") def load_xyz_from_file(filepath): + """ + Loads an XYZ file and returns the content as a string. + + Parameters + ---------- + filepath (str): The path to the XYZ file to be loaded. + + Returns + ------- + str: The content of the XYZ file as a string. + """ with open(filepath, 'r') as f: lines = f.readlines() @@ -59,6 +85,23 @@ def load_xyz_from_file(filepath): def write_xTB_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*', mol=None, conformer=None): """ + Runs a xTB geometry optimisation and caulcates electronic proeprities using Psi4, based on the provided parameters. + + Parameters + ---------- + job_name (str): The type of job to run. Possible values: + - 'opt': Optimisation neutral + mol_name (str): The name of the molecule. + smile (str): The SMILE string of the molecule. + functional (str, optional): The functional to use. Default is 'b3lyp'. + basis_set (str, optional): The basis set to use. Default is '6-31g'. + mol (rdkit.Chem.rdchem.Mol, optional): The RDKit embedded molecule object. + conformer (rdkit.Chem.rdchem.Conformer, optional): The RDKit conformer of the molecule. + + Returns + ------- + None: Writes the psi4 input file to disk. + """ if (job_name=='opt'): diff --git a/build/lib/QCflow/write_xTB.py b/build/lib/QCflow/write_xTB.py index af78cb6..29c3976 100644 --- a/build/lib/QCflow/write_xTB.py +++ b/build/lib/QCflow/write_xTB.py @@ -11,7 +11,22 @@ import tempfile def run_xtb_optimisation(xyz: str, output_file: str, charge=0, uhf=0, gfn=2): - """Run xTB geometry optimisation using GFN2-xTB and save to output_file.""" + """ + Runs a xTB geometry optimisation using GFN2-xTB and saves the result to output_file. + + Parameters + ---------- + xyz (str): The input geometry in XYZ format as a string. + output_file (str): The path to the file where the optimised geometry will be saved + charge (int, optional): The total charge of the system. Default is 0. + uhf (int, optional): The number of unpaired electrons (spin multiplicity - 1). Default is 0 (singlet). + gfn (int, optional): The GFN-xTB method to use (1, 2, or 3). Default is 2 (GFN2-xTB). + + Returns + ------- + None: Writes the optimised geometry to output_file. + + """ with tempfile.TemporaryDirectory() as tmpdir: xyz_path = os.path.join(tmpdir, "input.xyz") with open(xyz_path, 'w') as f: @@ -43,6 +58,18 @@ def run_xtb_optimisation(xyz: str, output_file: str, charge=0, uhf=0, gfn=2): print(f"Optimised structure saved to: {output_file}") def load_xyz_from_file(filepath): + """ + Loads an XYZ file and returns the content as a string. + + Parameters + ---------- + filepath (str): The path to the XYZ file to be loaded. + + Returns + ------- + str: The content of the XYZ file as a string. + + """ with open(filepath, 'r') as f: lines = f.readlines() @@ -59,6 +86,23 @@ def load_xyz_from_file(filepath): def write_xTB_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*', mol=None, conformer=None): """ + Runs a xTB geometry optimisation and caulcates electronic proeprities using Psi4, based on the provided parameters. + + Parameters + ---------- + job_name (str): The type of job to run. Possible values: + - 'opt': Optimisation neutral + mol_name (str): The name of the molecule. + smile (str): The SMILE string of the molecule. + functional (str, optional): The functional to use. Default is 'b3lyp'. + basis_set (str, optional): The basis set to use. Default is '6-31g'. + mol (rdkit.Chem.rdchem.Mol, optional): The RDKit embedded molecule object. + conformer (rdkit.Chem.rdchem.Conformer, optional): The RDKit conformer of the molecule. + + Returns + ------- + None: Writes the psi4 input file to disk. + """ if (job_name=='opt'): From 76f9c910a7b4a2dba268026ba3827cc5342db649 Mon Sep 17 00:00:00 2001 From: TristanSJones Date: Tue, 3 Mar 2026 10:58:31 +0000 Subject: [PATCH 16/16] fixing write_psi4 bug --- Examples/example_psi4_opt_submission.py | 21 +++++++++++++++++++++ QCflow/write_psi4.py | 2 +- build/lib/QCflow/write_psi4.py | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Examples/example_psi4_opt_submission.py b/Examples/example_psi4_opt_submission.py index e69de29..0c0d5bf 100644 --- a/Examples/example_psi4_opt_submission.py +++ b/Examples/example_psi4_opt_submission.py @@ -0,0 +1,21 @@ +import rdkit +from rdkit import Chem +from rdkit.Chem import Draw +from rdkit.Chem import AllChem +import numpy as np +import pandas as pd +import QCflow +from QCflow.load_gaussian import * +from QCflow.torsion_parser import * +from QCflow.find_torsion import * +from QCflow.write_psi4 import * +from QCflow.run_psi4 import * +from QCflow.energy_calculations import * +import os + +df = pd.read_csv('FilteredSmilesFragments_props.csv') + +smiles_dict = {str(i): row['smiles'] for i, row in df.iterrows()} + +for k, v in smiles_dict.items(): + run_psi4('opt', k, v, 12, 10, 'b3lyp', '3-21G') diff --git a/QCflow/write_psi4.py b/QCflow/write_psi4.py index 8251646..92c8746 100755 --- a/QCflow/write_psi4.py +++ b/QCflow/write_psi4.py @@ -214,7 +214,7 @@ def write_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*' file.write(' file.write(f"HOMO: {homo_energy_ev:.6f} eV\\n") \n') file.write(' file.write(f"LUMO: {lumo_energy_ev:.6f} eV\\n") \n') file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') - file.write(' \n') + file.write(' \n') else: print(f"Invalid job_name: {job_name}, please use 'opt', 'sp' or 'opt_pre_geom'. See documentation for more details.") diff --git a/build/lib/QCflow/write_psi4.py b/build/lib/QCflow/write_psi4.py index 8251646..92c8746 100755 --- a/build/lib/QCflow/write_psi4.py +++ b/build/lib/QCflow/write_psi4.py @@ -214,7 +214,7 @@ def write_psi4(job_name, mol_name, smile, functional='b3lyp', basis_set='6-31g*' file.write(' file.write(f"HOMO: {homo_energy_ev:.6f} eV\\n") \n') file.write(' file.write(f"LUMO: {lumo_energy_ev:.6f} eV\\n") \n') file.write(' file.write(f"Energy gap (HOMO-LUMO): {energy_gap_ev:.6f} eV\\n") \n') - file.write(' \n') + file.write(' \n') else: print(f"Invalid job_name: {job_name}, please use 'opt', 'sp' or 'opt_pre_geom'. See documentation for more details.")