molSimplify 1.7.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- docs/source/conf.py +224 -0
- molSimplify/Classes/__init__.py +6 -0
- molSimplify/Classes/atom3D.py +235 -0
- molSimplify/Classes/dft_obs.py +130 -0
- molSimplify/Classes/globalvars.py +827 -0
- molSimplify/Classes/helpers.py +161 -0
- molSimplify/Classes/ligand.py +2330 -0
- molSimplify/Classes/mGUI.py +2493 -0
- molSimplify/Classes/mWidgets.py +438 -0
- molSimplify/Classes/miniGUI.py +41 -0
- molSimplify/Classes/mol2D.py +260 -0
- molSimplify/Classes/mol3D.py +5846 -0
- molSimplify/Classes/monomer3D.py +253 -0
- molSimplify/Classes/partialcharges.py +226 -0
- molSimplify/Classes/protein3D.py +1178 -0
- molSimplify/Classes/rundiag.py +151 -0
- molSimplify/Data/ML.dat +212 -0
- molSimplify/Data/MLS_FSR_for_inter.dat +23 -0
- molSimplify/Data/MLS_FSR_for_inter2.dat +23 -0
- molSimplify/Data/MLS_angle_for_click.dat +8 -0
- molSimplify/Data/MLS_angle_for_inter.dat +23 -0
- molSimplify/Data/MLS_angle_for_inter2.dat +48 -0
- molSimplify/Data/MLS_angle_for_intra.dat +10 -0
- molSimplify/Data/MLS_angle_for_intra2.dat +6 -0
- molSimplify/Data/MLS_angle_for_oa.dat +18 -0
- molSimplify/Data/ML_FSR_for_inter.dat +112 -0
- molSimplify/Data/ML_FSR_for_inter2.dat +110 -0
- molSimplify/Data/ML_bond_for_cat.dat +8 -0
- molSimplify/Data/ML_bond_for_click.dat +8 -0
- molSimplify/Data/ML_bond_for_inter.dat +48 -0
- molSimplify/Data/ML_bond_for_inter2.dat +48 -0
- molSimplify/Data/ML_bond_for_intra.dat +10 -0
- molSimplify/Data/ML_bond_for_intra2.dat +6 -0
- molSimplify/Data/ML_bond_for_oa.dat +18 -0
- molSimplify/Data/bp1.dat +21 -0
- molSimplify/Data/li.dat +3 -0
- molSimplify/Data/no.dat +2 -0
- molSimplify/Data/oct.dat +7 -0
- molSimplify/Data/pbp.dat +8 -0
- molSimplify/Data/spy.dat +6 -0
- molSimplify/Data/sqap.dat +9 -0
- molSimplify/Data/sqp.dat +5 -0
- molSimplify/Data/tbp.dat +6 -0
- molSimplify/Data/tdhd.dat +9 -0
- molSimplify/Data/thd.dat +5 -0
- molSimplify/Data/tpl.dat +4 -0
- molSimplify/Data/tpr.dat +7 -0
- molSimplify/Informatics/HFXsensitivity/__init__.py +0 -0
- molSimplify/Informatics/HFXsensitivity/measure_HFX_sensitivity_oxo_hat_reb_rel.py +443 -0
- molSimplify/Informatics/HFXsensitivity/measure_HFX_stable.py +346 -0
- molSimplify/Informatics/MOF/Linker_rotation.py +179 -0
- molSimplify/Informatics/MOF/MOF_descriptors.py +1299 -0
- molSimplify/Informatics/MOF/MOF_descriptors_alternate_functional.py +589 -0
- molSimplify/Informatics/MOF/MOF_functionalizer.py +1648 -0
- molSimplify/Informatics/MOF/PBC_functions.py +1347 -0
- molSimplify/Informatics/MOF/__init__.py +0 -0
- molSimplify/Informatics/MOF/atomic.py +267 -0
- molSimplify/Informatics/MOF/cluster_extraction.py +388 -0
- molSimplify/Informatics/MOF/fragment_MOFs_for_pormake.py +895 -0
- molSimplify/Informatics/MOF/monofunctionalized_BDC/index_information.py +10 -0
- molSimplify/Informatics/Mol2Parser.py +46 -0
- molSimplify/Informatics/RACassemble.py +408 -0
- molSimplify/Informatics/__init__.py +0 -0
- molSimplify/Informatics/active_learning/__init__.py +0 -0
- molSimplify/Informatics/active_learning/expected_improvement.py +269 -0
- molSimplify/Informatics/autocorrelation.py +1930 -0
- molSimplify/Informatics/clean_autocorrelation.py +778 -0
- molSimplify/Informatics/coulomb_analyze.py +67 -0
- molSimplify/Informatics/decoration_manager.py +193 -0
- molSimplify/Informatics/geo_analyze.py +88 -0
- molSimplify/Informatics/geometrics.py +56 -0
- molSimplify/Informatics/graph_analyze.py +163 -0
- molSimplify/Informatics/graph_racs.py +288 -0
- molSimplify/Informatics/jupyter_vis.py +172 -0
- molSimplify/Informatics/lacRACAssemble.py +2192 -0
- molSimplify/Informatics/lacRACAssemble_bisdithiolenes.py +236 -0
- molSimplify/Informatics/misc_descriptors.py +198 -0
- molSimplify/Informatics/organic_fingerprints.py +61 -0
- molSimplify/Informatics/partialcharges.py +345 -0
- molSimplify/Informatics/protein/activesite.py +53 -0
- molSimplify/Informatics/protein/pymol_add_hs.py +33 -0
- molSimplify/Informatics/rac155_geo.py +48 -0
- molSimplify/Ligands/(1_methylbenzimidazol_2_yl)pyridine.xyz +45 -0
- molSimplify/Ligands/1-4-dimethyl-1-2-3-triazole.xyz +15 -0
- molSimplify/Ligands/12crown4.mol +62 -0
- molSimplify/Ligands/Antipyrine.mol +58 -0
- molSimplify/Ligands/BPAbipy.mol +106 -0
- molSimplify/Ligands/Hpyrrole.mol +26 -0
- molSimplify/Ligands/N-quinolinylbutyramidate.xyz +31 -0
- molSimplify/Ligands/N-quinolinylmethylmethinylacetamidate.xyz +30 -0
- molSimplify/Ligands/NMe2_-1.xyz +11 -0
- molSimplify/Ligands/PCy3.mol +111 -0
- molSimplify/Ligands/PMe3.xyz +15 -0
- molSimplify/Ligands/PPh3.mol +76 -0
- molSimplify/Ligands/Propyphenazone.mol +77 -0
- molSimplify/Ligands/acac.mol +33 -0
- molSimplify/Ligands/acacen.mol +76 -0
- molSimplify/Ligands/acetate.smi +1 -0
- molSimplify/Ligands/acetate.xyz +9 -0
- molSimplify/Ligands/aceticacidbipyridine.mol +70 -0
- molSimplify/Ligands/acetonitrile.mol +17 -0
- molSimplify/Ligands/alanine.mol +30 -0
- molSimplify/Ligands/alphabetizer.py +21 -0
- molSimplify/Ligands/amine.mol +11 -0
- molSimplify/Ligands/ammonia.mol +12 -0
- molSimplify/Ligands/arginine.mol +58 -0
- molSimplify/Ligands/asparagine.mol +38 -0
- molSimplify/Ligands/aspartic_acid.mol +35 -0
- molSimplify/Ligands/azide.mol +11 -0
- molSimplify/Ligands/benzene.mol +28 -0
- molSimplify/Ligands/benzene_pi.mol +30 -0
- molSimplify/Ligands/benzenedithiol.mol +30 -0
- molSimplify/Ligands/benzenethiol.mol +30 -0
- molSimplify/Ligands/benzylisocy.mol +38 -0
- molSimplify/Ligands/bidiazine.mol +42 -0
- molSimplify/Ligands/bidiazole.mol +38 -0
- molSimplify/Ligands/bifuran.mol +38 -0
- molSimplify/Ligands/bihydrodiazine.mol +58 -0
- molSimplify/Ligands/bihydrodiazole.mol +46 -0
- molSimplify/Ligands/bihydrooxazine.mol +54 -0
- molSimplify/Ligands/bihydrooxazole.mol +42 -0
- molSimplify/Ligands/bihydrothiazine.mol +54 -0
- molSimplify/Ligands/bihydrothiazole.mol +42 -0
- molSimplify/Ligands/biimidazole.mol +38 -0
- molSimplify/Ligands/bioxazole.mol +34 -0
- molSimplify/Ligands/bipy.mol +46 -0
- molSimplify/Ligands/bipyrazine.xyz +20 -0
- molSimplify/Ligands/bipyrimidine.mol +42 -0
- molSimplify/Ligands/bipyrrole.mol +42 -0
- molSimplify/Ligands/bisnapthyridylpyridine.mol +111 -0
- molSimplify/Ligands/bithiazole.mol +34 -0
- molSimplify/Ligands/bromide.mol +7 -0
- molSimplify/Ligands/bromide.smi +1 -0
- molSimplify/Ligands/c2.mol +9 -0
- molSimplify/Ligands/caprolactone.mol +41 -0
- molSimplify/Ligands/carbonyl.mol +8 -0
- molSimplify/Ligands/carboxyl.mol +13 -0
- molSimplify/Ligands/cat.mol +30 -0
- molSimplify/Ligands/chloride.mol +7 -0
- molSimplify/Ligands/chloride.smi +1 -0
- molSimplify/Ligands/chloropyridine.mol +27 -0
- molSimplify/Ligands/co2.mol +10 -0
- molSimplify/Ligands/corrolazine.mol +72 -0
- molSimplify/Ligands/cs.mol +8 -0
- molSimplify/Ligands/cyanate.xyz +5 -0
- molSimplify/Ligands/cyanide.mol +9 -0
- molSimplify/Ligands/cyanoaceticporphyrin.mol +114 -0
- molSimplify/Ligands/cyanopyridine.mol +29 -0
- molSimplify/Ligands/cyclam.mol +81 -0
- molSimplify/Ligands/cyclen.mol +69 -0
- molSimplify/Ligands/cyclopentadienyl.mol +26 -0
- molSimplify/Ligands/cysteine.mol +32 -0
- molSimplify/Ligands/diaminomethyl.mol +19 -0
- molSimplify/Ligands/diazine.mol +25 -0
- molSimplify/Ligands/diazole.mol +23 -0
- molSimplify/Ligands/dicyanamide.mol +15 -0
- molSimplify/Ligands/dihydrofuran.mol +27 -0
- molSimplify/Ligands/dmap.xyz +35 -0
- molSimplify/Ligands/dmf.mol +28 -0
- molSimplify/Ligands/dmi.mol +41 -0
- molSimplify/Ligands/dmpe.mol +52 -0
- molSimplify/Ligands/dpmu.mol +47 -0
- molSimplify/Ligands/dppe.mol +112 -0
- molSimplify/Ligands/edta.mol +69 -0
- molSimplify/Ligands/en.mol +28 -0
- molSimplify/Ligands/ethanethiol.mol +21 -0
- molSimplify/Ligands/ethanolamine.mol +26 -0
- molSimplify/Ligands/ethbipy.mol +70 -0
- molSimplify/Ligands/ethyl.mol +19 -0
- molSimplify/Ligands/ethylamine.mol +24 -0
- molSimplify/Ligands/ethylene.mol +16 -0
- molSimplify/Ligands/ethylesteracac.mol +57 -0
- molSimplify/Ligands/fluoride.mol +7 -0
- molSimplify/Ligands/fluoride.smi +1 -0
- molSimplify/Ligands/formaldehyde.mol +12 -0
- molSimplify/Ligands/formamidate.xyz +8 -0
- molSimplify/Ligands/formate.xyz +6 -0
- molSimplify/Ligands/furan.mol +23 -0
- molSimplify/Ligands/glutamic_acid.mol +42 -0
- molSimplify/Ligands/glutamine.mol +44 -0
- molSimplify/Ligands/glycinate.mol +23 -0
- molSimplify/Ligands/glycine.mol +24 -0
- molSimplify/Ligands/h2s.mol +10 -0
- molSimplify/Ligands/helium.mol +6 -0
- molSimplify/Ligands/histidine.mol +45 -0
- molSimplify/Ligands/hmpa.mol +62 -0
- molSimplify/Ligands/hs-.mol +9 -0
- molSimplify/Ligands/hydride.mol +7 -0
- molSimplify/Ligands/hydrocarboxyacetylide.xyz +8 -0
- molSimplify/Ligands/hydrocyanide.mol +10 -0
- molSimplify/Ligands/hydrodiazine.mol +33 -0
- molSimplify/Ligands/hydrodiazole.mol +27 -0
- molSimplify/Ligands/hydrogensulfide.mol +10 -0
- molSimplify/Ligands/hydroisocyanide.mol +11 -0
- molSimplify/Ligands/hydrooxazine.mol +31 -0
- molSimplify/Ligands/hydrooxazole.mol +25 -0
- molSimplify/Ligands/hydrothiazine.mol +31 -0
- molSimplify/Ligands/hydrothiazole.mol +25 -0
- molSimplify/Ligands/hydroxyl.mol +9 -0
- molSimplify/Ligands/imidazole.mol +23 -0
- molSimplify/Ligands/imidazolidinone.mol +29 -0
- molSimplify/Ligands/imine.mol +13 -0
- molSimplify/Ligands/iminodiacetic.mol +33 -0
- molSimplify/Ligands/iodide.mol +7 -0
- molSimplify/Ligands/iodobenzene.xyz +14 -0
- molSimplify/Ligands/isoleucine.mol +48 -0
- molSimplify/Ligands/isothiocyanate.mol +11 -0
- molSimplify/Ligands/leucine.mol +48 -0
- molSimplify/Ligands/ligands.dict +257 -0
- molSimplify/Ligands/lysine.mol +54 -0
- molSimplify/Ligands/mebenzenedithiol.mol +36 -0
- molSimplify/Ligands/mebim_py.xyz +29 -0
- molSimplify/Ligands/mebim_pz.xyz +28 -0
- molSimplify/Ligands/mebipy.mol +58 -0
- molSimplify/Ligands/mecat.mol +36 -0
- molSimplify/Ligands/methanal.mol +11 -0
- molSimplify/Ligands/methanethiol.mol +15 -0
- molSimplify/Ligands/methanol.mol +16 -0
- molSimplify/Ligands/methionine.mol +44 -0
- molSimplify/Ligands/methyl.mol +13 -0
- molSimplify/Ligands/methylacetylide.xyz +8 -0
- molSimplify/Ligands/methylamine.mol +19 -0
- molSimplify/Ligands/methylazide.xyz +9 -0
- molSimplify/Ligands/methylisocy.mol +17 -0
- molSimplify/Ligands/methylpyridine.mol +33 -0
- molSimplify/Ligands/n2.mol +8 -0
- molSimplify/Ligands/n4py.xyz +51 -0
- molSimplify/Ligands/nch.mol +10 -0
- molSimplify/Ligands/nco-.mol +11 -0
- molSimplify/Ligands/nethanolamine.mol +26 -0
- molSimplify/Ligands/nitrate.mol +14 -0
- molSimplify/Ligands/nitrite.mol +11 -0
- molSimplify/Ligands/nitro.mol +11 -0
- molSimplify/Ligands/nitrobipy.mol +54 -0
- molSimplify/Ligands/nitroso.mol +8 -0
- molSimplify/Ligands/nme3.mol +30 -0
- molSimplify/Ligands/no-.mol +10 -0
- molSimplify/Ligands/no2-.mol +11 -0
- molSimplify/Ligands/noxygen.mol +8 -0
- molSimplify/Ligands/ns-.mol +10 -0
- molSimplify/Ligands/o-pyridylbenzene.xyz +23 -0
- molSimplify/Ligands/o-pyridylphenylanion.xyz +22 -0
- molSimplify/Ligands/o2-.mol +9 -0
- molSimplify/Ligands/o2.xyz +4 -0
- molSimplify/Ligands/och2.mol +12 -0
- molSimplify/Ligands/oethanolamine.mol +26 -0
- molSimplify/Ligands/ome2.mol +22 -0
- molSimplify/Ligands/ooh.xyz +5 -0
- molSimplify/Ligands/oxalate.mol +17 -0
- molSimplify/Ligands/oxalate.smi +1 -0
- molSimplify/Ligands/oxygen.mol +7 -0
- molSimplify/Ligands/pentacyanocyclopentadienide.mol +36 -0
- molSimplify/Ligands/ph2-.mol +11 -0
- molSimplify/Ligands/ph3.mol +12 -0
- molSimplify/Ligands/phen.mol +51 -0
- molSimplify/Ligands/phenacac.mol +63 -0
- molSimplify/Ligands/phenalalanine.mol +51 -0
- molSimplify/Ligands/phendione.mol +51 -0
- molSimplify/Ligands/phenphen.mol +75 -0
- molSimplify/Ligands/phenylbenzoxazole.mol +54 -0
- molSimplify/Ligands/phenylcyc.mol +99 -0
- molSimplify/Ligands/phenylenediamine.mol +37 -0
- molSimplify/Ligands/phenylisocy.mol +32 -0
- molSimplify/Ligands/phosacidbipy.mol +66 -0
- molSimplify/Ligands/phosphine.mol +13 -0
- molSimplify/Ligands/phosphorine.mol +27 -0
- molSimplify/Ligands/phosphorustrifluoride.mol +12 -0
- molSimplify/Ligands/phthalocyanine.mol +126 -0
- molSimplify/Ligands/pme3o.mol +32 -0
- molSimplify/Ligands/porphyrin.mol +82 -0
- molSimplify/Ligands/pph3o.mol +77 -0
- molSimplify/Ligands/proline.mol +39 -0
- molSimplify/Ligands/propdiol.mol +21 -0
- molSimplify/Ligands/propylene.mol +23 -0
- molSimplify/Ligands/pyridine.mol +27 -0
- molSimplify/Ligands/pyrimidone.mol +27 -0
- molSimplify/Ligands/pyrrole.mol +24 -0
- molSimplify/Ligands/quinoxalinedithiol.mol +39 -0
- molSimplify/Ligands/s2-.mol +9 -0
- molSimplify/Ligands/salen.mol +75 -0
- molSimplify/Ligands/salphen.mol +84 -0
- molSimplify/Ligands/serine.mol +32 -0
- molSimplify/Ligands/simple_ligands.dict +14 -0
- molSimplify/Ligands/sulfacidbipy.mol +63 -0
- molSimplify/Ligands/tbucat.mol +54 -0
- molSimplify/Ligands/tbuphisocy.mol +56 -0
- molSimplify/Ligands/tbutylcyclen.mol +166 -0
- molSimplify/Ligands/tbutylisocy.mol +35 -0
- molSimplify/Ligands/tbutylthiol.mol +33 -0
- molSimplify/Ligands/tcnoet.mol +43 -0
- molSimplify/Ligands/tcnoetOH.mol +45 -0
- molSimplify/Ligands/terpy.mol +65 -0
- molSimplify/Ligands/tetrahydrofuran.mol +31 -0
- molSimplify/Ligands/thiane.mol +37 -0
- molSimplify/Ligands/thiazole.mol +21 -0
- molSimplify/Ligands/thiocyanate.mol +11 -0
- molSimplify/Ligands/thiol.mol +9 -0
- molSimplify/Ligands/thiophene.mol +23 -0
- molSimplify/Ligands/thiopyridine.mol +29 -0
- molSimplify/Ligands/threonine.mol +38 -0
- molSimplify/Ligands/tpp.mol +165 -0
- molSimplify/Ligands/tricyanomethyl.mol +19 -0
- molSimplify/Ligands/trifluoromethyl.mol +13 -0
- molSimplify/Ligands/tryptophan.mol +60 -0
- molSimplify/Ligands/tyrosine.mol +53 -0
- molSimplify/Ligands/uthiol.mol +11 -0
- molSimplify/Ligands/uthiolme2.mol +23 -0
- molSimplify/Ligands/valine.mol +42 -0
- molSimplify/Ligands/water.mol +10 -0
- molSimplify/Ligands/x.mol +6 -0
- molSimplify/Scripts/__init__.py +0 -0
- molSimplify/Scripts/addtodb.py +308 -0
- molSimplify/Scripts/cellbuilder.py +1592 -0
- molSimplify/Scripts/cellbuilder_tools.py +701 -0
- molSimplify/Scripts/chains.py +342 -0
- molSimplify/Scripts/convert_2to3.py +23 -0
- molSimplify/Scripts/dbinteract.py +631 -0
- molSimplify/Scripts/distgeom.py +617 -0
- molSimplify/Scripts/findcorrelations.py +287 -0
- molSimplify/Scripts/generator.py +267 -0
- molSimplify/Scripts/geometry.py +1224 -0
- molSimplify/Scripts/grabguivars.py +845 -0
- molSimplify/Scripts/in_b3lyp_usetc.py +141 -0
- molSimplify/Scripts/inparse.py +1673 -0
- molSimplify/Scripts/io.py +1149 -0
- molSimplify/Scripts/isomers.py +415 -0
- molSimplify/Scripts/jobgen.py +247 -0
- molSimplify/Scripts/krr_prep.py +1262 -0
- molSimplify/Scripts/molSimplify_io.py +18 -0
- molSimplify/Scripts/molden2psi4wfn.py +166 -0
- molSimplify/Scripts/namegen.py +32 -0
- molSimplify/Scripts/nn_prep.py +561 -0
- molSimplify/Scripts/oct_check_mols.py +782 -0
- molSimplify/Scripts/periodic_QE.py +97 -0
- molSimplify/Scripts/postmold.py +304 -0
- molSimplify/Scripts/postmwfn.py +709 -0
- molSimplify/Scripts/postparse.py +488 -0
- molSimplify/Scripts/postproc.py +139 -0
- molSimplify/Scripts/qcgen.py +1450 -0
- molSimplify/Scripts/rmsd.py +489 -0
- molSimplify/Scripts/rungen.py +670 -0
- molSimplify/Scripts/structgen.py +3040 -0
- molSimplify/Scripts/tf_nn_prep.py +894 -0
- molSimplify/Scripts/tsgen.py +295 -0
- molSimplify/Scripts/uq_calibration.py +69 -0
- molSimplify/__init__.py +0 -0
- molSimplify/__main__.py +197 -0
- molSimplify/icons/chemdb.png +0 -0
- molSimplify/icons/hjklogo.png +0 -0
- molSimplify/icons/icon.png +0 -0
- molSimplify/icons/logo.png +0 -0
- molSimplify/icons/logo_old.png +0 -0
- molSimplify/icons/petachem.png +0 -0
- molSimplify/icons/petachem2.png +0 -0
- molSimplify/icons/petachem_full.png +0 -0
- molSimplify/icons/pythonlogo.png +0 -0
- molSimplify/icons/sge copy.png +0 -0
- molSimplify/icons/sge.png +0 -0
- molSimplify/icons/slurm.png +0 -0
- molSimplify/icons/wft1.png +0 -0
- molSimplify/icons/wft2.png +0 -0
- molSimplify/icons/wft3.png +0 -0
- molSimplify/ml/__init__.py +0 -0
- molSimplify/ml/kernels.py +36 -0
- molSimplify/ml/layers.py +29 -0
- molSimplify/molscontrol/__init__.py +14 -0
- molSimplify/molscontrol/_version.py +521 -0
- molSimplify/molscontrol/clf_tools.py +144 -0
- molSimplify/molscontrol/data/README.md +21 -0
- molSimplify/molscontrol/data/look_and_say.dat +15 -0
- molSimplify/molscontrol/dynamic_classifier.py +514 -0
- molSimplify/molscontrol/io_tools.py +363 -0
- molSimplify/molscontrol/molscontrol.py +49 -0
- molSimplify/molscontrol/terachem/jobscript_control.sh +31 -0
- molSimplify/molscontrol/terachem/terachem_input +22 -0
- molSimplify/python_krr/X_train_TS.csv +535 -0
- molSimplify/python_krr/__init__.py +0 -0
- molSimplify/python_krr/hat2_X_mean_std.csv +3 -0
- molSimplify/python_krr/hat2_feature_names.csv +1 -0
- molSimplify/python_krr/hat2_y_mean_std.csv +2 -0
- molSimplify/python_krr/hat_X_mean_std.csv +6 -0
- molSimplify/python_krr/hat_feature_names.csv +1 -0
- molSimplify/python_krr/hat_krr_X_train.csv +5205 -0
- molSimplify/python_krr/hat_krr_dual_coef.csv +1 -0
- molSimplify/python_krr/hat_y_mean_std.csv +2 -0
- molSimplify/python_krr/sklearn_models.py +34 -0
- molSimplify/python_krr/y_train_TS.csv +535 -0
- molSimplify/python_nn/ANN.py +198 -0
- molSimplify/python_nn/__init__.py +0 -0
- molSimplify/python_nn/clf_analysis_tool.py +125 -0
- molSimplify/python_nn/dictionary_toolbox.py +49 -0
- molSimplify/python_nn/ensemble_test.py +309 -0
- molSimplify/python_nn/hs_center.csv +26 -0
- molSimplify/python_nn/hs_scale.csv +26 -0
- molSimplify/python_nn/ls_center.csv +26 -0
- molSimplify/python_nn/ls_scale.csv +26 -0
- molSimplify/python_nn/ms_hs_b1.csv +50 -0
- molSimplify/python_nn/ms_hs_b2.csv +50 -0
- molSimplify/python_nn/ms_hs_b3.csv +1 -0
- molSimplify/python_nn/ms_hs_w1.csv +50 -0
- molSimplify/python_nn/ms_hs_w2.csv +50 -0
- molSimplify/python_nn/ms_hs_w3.csv +1 -0
- molSimplify/python_nn/ms_ls_b1.csv +50 -0
- molSimplify/python_nn/ms_ls_b2.csv +50 -0
- molSimplify/python_nn/ms_ls_b3.csv +1 -0
- molSimplify/python_nn/ms_ls_w1.csv +50 -0
- molSimplify/python_nn/ms_ls_w2.csv +50 -0
- molSimplify/python_nn/ms_ls_w3.csv +1 -0
- molSimplify/python_nn/ms_slope_b1.csv +50 -0
- molSimplify/python_nn/ms_slope_b2.csv +50 -0
- molSimplify/python_nn/ms_slope_b3.csv +1 -0
- molSimplify/python_nn/ms_slope_w1.csv +50 -0
- molSimplify/python_nn/ms_slope_w2.csv +50 -0
- molSimplify/python_nn/ms_slope_w3.csv +1 -0
- molSimplify/python_nn/ms_split_b1.csv +50 -0
- molSimplify/python_nn/ms_split_b2.csv +50 -0
- molSimplify/python_nn/ms_split_b3.csv +1 -0
- molSimplify/python_nn/ms_split_w1.csv +50 -0
- molSimplify/python_nn/ms_split_w2.csv +50 -0
- molSimplify/python_nn/ms_split_w3.csv +1 -0
- molSimplify/python_nn/slope_center.csv +25 -0
- molSimplify/python_nn/slope_scale.csv +25 -0
- molSimplify/python_nn/split_center.csv +26 -0
- molSimplify/python_nn/split_scale.csv +26 -0
- molSimplify/python_nn/tf_ANN.py +762 -0
- molSimplify/python_nn/train_data.csv +1211 -0
- molSimplify/tf_nn/__init__.py +0 -0
- molSimplify/tf_nn/geo_static_clf/geo_static_clf_model.h5 +0 -0
- molSimplify/tf_nn/geo_static_clf/geo_static_clf_train_name.csv +1591 -0
- molSimplify/tf_nn/geo_static_clf/geo_static_clf_train_x.csv +2790 -0
- molSimplify/tf_nn/geo_static_clf/geo_static_clf_train_y.csv +2790 -0
- molSimplify/tf_nn/geo_static_clf/geo_static_clf_vars.csv +154 -0
- molSimplify/tf_nn/geos/hs_ii_bl_x.csv +1577 -0
- molSimplify/tf_nn/geos/hs_ii_bl_y.csv +1577 -0
- molSimplify/tf_nn/geos/hs_ii_model.h5 +0 -0
- molSimplify/tf_nn/geos/hs_ii_model.json +1 -0
- molSimplify/tf_nn/geos/hs_ii_vars.csv +154 -0
- molSimplify/tf_nn/geos/hs_iii_bl_x.csv +1659 -0
- molSimplify/tf_nn/geos/hs_iii_bl_y.csv +1659 -0
- molSimplify/tf_nn/geos/hs_iii_model.h5 +0 -0
- molSimplify/tf_nn/geos/hs_iii_model.json +1 -0
- molSimplify/tf_nn/geos/hs_iii_vars.csv +154 -0
- molSimplify/tf_nn/geos/ls_ii_bl_x.csv +1374 -0
- molSimplify/tf_nn/geos/ls_ii_bl_y.csv +1374 -0
- molSimplify/tf_nn/geos/ls_ii_model.h5 +0 -0
- molSimplify/tf_nn/geos/ls_ii_model.json +1 -0
- molSimplify/tf_nn/geos/ls_ii_vars.csv +154 -0
- molSimplify/tf_nn/geos/ls_iii_bl_x.csv +1364 -0
- molSimplify/tf_nn/geos/ls_iii_bl_y.csv +1364 -0
- molSimplify/tf_nn/geos/ls_iii_model.h5 +0 -0
- molSimplify/tf_nn/geos/ls_iii_model.json +1 -0
- molSimplify/tf_nn/geos/ls_iii_vars.csv +154 -0
- molSimplify/tf_nn/homolumo/gap_model.h5 +0 -0
- molSimplify/tf_nn/homolumo/gap_model.json +1 -0
- molSimplify/tf_nn/homolumo/gap_test_names.csv +175 -0
- molSimplify/tf_nn/homolumo/gap_test_x.csv +176 -0
- molSimplify/tf_nn/homolumo/gap_test_y.csv +176 -0
- molSimplify/tf_nn/homolumo/gap_train_names.csv +699 -0
- molSimplify/tf_nn/homolumo/gap_train_x.csv +700 -0
- molSimplify/tf_nn/homolumo/gap_train_y.csv +700 -0
- molSimplify/tf_nn/homolumo/gap_vars.csv +153 -0
- molSimplify/tf_nn/homolumo/homo_model.h5 +0 -0
- molSimplify/tf_nn/homolumo/homo_model.json +126 -0
- molSimplify/tf_nn/homolumo/homo_test_names.csv +175 -0
- molSimplify/tf_nn/homolumo/homo_test_x.csv +176 -0
- molSimplify/tf_nn/homolumo/homo_test_y.csv +176 -0
- molSimplify/tf_nn/homolumo/homo_train_names.csv +699 -0
- molSimplify/tf_nn/homolumo/homo_train_x.csv +700 -0
- molSimplify/tf_nn/homolumo/homo_train_y.csv +700 -0
- molSimplify/tf_nn/homolumo/homo_vars.csv +153 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_info.json +7 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_model.h5 +0 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_model.json +1 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_test_names.csv +143 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_test_x.csv +144 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_test_y.csv +144 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_train_names.csv +513 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_train_x.csv +514 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_train_y.csv +514 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_val_names.csv +143 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_val_x.csv +58 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_val_y.csv +58 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_vars.csv +155 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_info.json +7 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_model.h5 +0 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_model.json +1 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_test_names.csv +143 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_test_x.csv +144 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_test_y.csv +144 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_train_names.csv +513 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_train_x.csv +514 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_train_y.csv +514 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_val_names.csv +143 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_val_x.csv +58 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_val_y.csv +58 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_vars.csv +154 -0
- molSimplify/tf_nn/oxocatalysis/hat_model.h5 +0 -0
- molSimplify/tf_nn/oxocatalysis/hat_model.json +1 -0
- molSimplify/tf_nn/oxocatalysis/hat_test_names.csv +419 -0
- molSimplify/tf_nn/oxocatalysis/hat_test_x.csv +420 -0
- molSimplify/tf_nn/oxocatalysis/hat_test_y.csv +420 -0
- molSimplify/tf_nn/oxocatalysis/hat_train_names.csv +1507 -0
- molSimplify/tf_nn/oxocatalysis/hat_train_x.csv +1508 -0
- molSimplify/tf_nn/oxocatalysis/hat_train_y.csv +1508 -0
- molSimplify/tf_nn/oxocatalysis/hat_val_x.csv +169 -0
- molSimplify/tf_nn/oxocatalysis/hat_val_y.csv +169 -0
- molSimplify/tf_nn/oxocatalysis/hat_vars.csv +162 -0
- molSimplify/tf_nn/oxocatalysis/oxo_model.h5 +0 -0
- molSimplify/tf_nn/oxocatalysis/oxo_model.json +1 -0
- molSimplify/tf_nn/oxocatalysis/oxo_test_names.csv +527 -0
- molSimplify/tf_nn/oxocatalysis/oxo_test_x.csv +528 -0
- molSimplify/tf_nn/oxocatalysis/oxo_test_y.csv +528 -0
- molSimplify/tf_nn/oxocatalysis/oxo_train_names.csv +1897 -0
- molSimplify/tf_nn/oxocatalysis/oxo_train_x.csv +1898 -0
- molSimplify/tf_nn/oxocatalysis/oxo_train_y.csv +1898 -0
- molSimplify/tf_nn/oxocatalysis/oxo_val_x.csv +212 -0
- molSimplify/tf_nn/oxocatalysis/oxo_val_y.csv +212 -0
- molSimplify/tf_nn/oxocatalysis/oxo_vars.csv +162 -0
- molSimplify/tf_nn/rescaling_data/gap_mean_x.csv +153 -0
- molSimplify/tf_nn/rescaling_data/gap_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/gap_var_x.csv +153 -0
- molSimplify/tf_nn/rescaling_data/gap_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/geo_static_clf_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/geo_static_clf_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/geo_static_clf_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/geo_static_clf_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/hat_mean_x.csv +162 -0
- molSimplify/tf_nn/rescaling_data/hat_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/hat_var_x.csv +162 -0
- molSimplify/tf_nn/rescaling_data/hat_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/homo_empty_mean_x.csv +155 -0
- molSimplify/tf_nn/rescaling_data/homo_empty_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/homo_empty_var_x.csv +155 -0
- molSimplify/tf_nn/rescaling_data/homo_empty_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/homo_mean_x.csv +153 -0
- molSimplify/tf_nn/rescaling_data/homo_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/homo_var_x.csv +153 -0
- molSimplify/tf_nn/rescaling_data/homo_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/hs_ii_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/hs_ii_mean_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/hs_ii_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/hs_ii_var_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/hs_iii_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/hs_iii_mean_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/hs_iii_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/hs_iii_var_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/ls_ii_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/ls_ii_mean_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/ls_ii_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/ls_ii_var_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/ls_iii_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/ls_iii_mean_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/ls_iii_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/ls_iii_var_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/oxo20_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/oxo20_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/oxo20_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/oxo20_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/oxo_mean_x.csv +162 -0
- molSimplify/tf_nn/rescaling_data/oxo_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/oxo_var_x.csv +162 -0
- molSimplify/tf_nn/rescaling_data/oxo_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/sc_static_clf_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/sc_static_clf_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/sc_static_clf_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/sc_static_clf_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/split_mean_x.csv +155 -0
- molSimplify/tf_nn/rescaling_data/split_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/split_var_x.csv +155 -0
- molSimplify/tf_nn/rescaling_data/split_var_y.csv +1 -0
- molSimplify/tf_nn/sc_static_clf/sc_static_clf_model.h5 +0 -0
- molSimplify/tf_nn/sc_static_clf/sc_static_clf_train_name.csv +1591 -0
- molSimplify/tf_nn/sc_static_clf/sc_static_clf_train_x.csv +1592 -0
- molSimplify/tf_nn/sc_static_clf/sc_static_clf_train_y.csv +1592 -0
- molSimplify/tf_nn/sc_static_clf/sc_static_clf_vars.csv +154 -0
- molSimplify/tf_nn/split/split_model.h5 +0 -0
- molSimplify/tf_nn/split/split_model.json +1 -0
- molSimplify/tf_nn/split/split_vars.csv +155 -0
- molSimplify/tf_nn/split/split_x.csv +1902 -0
- molSimplify/tf_nn/split/split_y.csv +1902 -0
- molSimplify/tf_nn/split/train_names.csv +1901 -0
- molSimplify/utils/__init__.py +0 -0
- molSimplify/utils/decorators.py +16 -0
- molSimplify/utils/metaclasses.py +12 -0
- molSimplify/utils/tensorflow.py +23 -0
- molSimplify/utils/timer.py +16 -0
- molSimplify-1.7.4.dist-info/LICENSE +674 -0
- molSimplify-1.7.4.dist-info/METADATA +821 -0
- molSimplify-1.7.4.dist-info/RECORD +651 -0
- molSimplify-1.7.4.dist-info/WHEEL +5 -0
- molSimplify-1.7.4.dist-info/entry_points.txt +3 -0
- molSimplify-1.7.4.dist-info/top_level.txt +4 -0
- tests/generateTests.py +122 -0
- tests/helperFuncs.py +658 -0
- tests/informatics/test_MOF_descriptors.py +128 -0
- tests/informatics/test_active_learning.py +113 -0
- tests/informatics/test_coulomb_analyze.py +24 -0
- tests/informatics/test_graph_racs.py +193 -0
- tests/ml/test_kernels.py +20 -0
- tests/ml/test_layers.py +47 -0
- tests/runtest.py +10 -0
- tests/test_Mol2D.py +128 -0
- tests/test_basic_imports.py +62 -0
- tests/test_bidentate.py +25 -0
- tests/test_cli.py +20 -0
- tests/test_distgeom.py +106 -0
- tests/test_example_1.py +29 -0
- tests/test_example_3.py +31 -0
- tests/test_example_5.py +43 -0
- tests/test_example_7.py +28 -0
- tests/test_example_8.py +15 -0
- tests/test_example_tbp.py +15 -0
- tests/test_ff_xtb.py +111 -0
- tests/test_geocheck_oct.py +26 -0
- tests/test_geocheck_one_empty.py +15 -0
- tests/test_geometry.py +44 -0
- tests/test_inparse.py +76 -0
- tests/test_io.py +84 -0
- tests/test_jobgen.py +84 -0
- tests/test_joption_pythonic.py +27 -0
- tests/test_ligand_assign.py +58 -0
- tests/test_ligand_assign_consistent.py +60 -0
- tests/test_ligand_class.py +26 -0
- tests/test_ligand_from_mol_file.py +35 -0
- tests/test_ligands.py +86 -0
- tests/test_mol3D.py +337 -0
- tests/test_molcas_caspt2.py +15 -0
- tests/test_molcas_casscf.py +15 -0
- tests/test_old_ANNs.py +68 -0
- tests/test_orca_ccsdt.py +15 -0
- tests/test_orca_dft.py +15 -0
- tests/test_qcgen.py +50 -0
- tests/test_racs.py +124 -0
- tests/test_rmsd.py +68 -0
- tests/test_structgen_functions.py +198 -0
- tests/test_tetrahedral.py +29 -0
- tests/test_tutorial_10_part_one.py +16 -0
- tests/test_tutorial_10_part_two.py +15 -0
- tests/test_tutorial_2.py +11 -0
- tests/test_tutorial_3.py +15 -0
- tests/test_tutorial_4.py +57 -0
- tests/test_tutorial_6.py +10 -0
- tests/test_tutorial_8.py +29 -0
- tests/test_tutorial_9_part_one.py +15 -0
- tests/test_tutorial_9_part_two.py +15 -0
- tests/test_tutorial_qm9_part_one.py +6 -0
- tests/testresources/refs/racs/generate_references.py +85 -0
- workflows/NandyJACSAu2022/bridge_functionalizer.py +253 -0
- workflows/NandyJACSAu2022/frag_functionalizer.py +242 -0
- workflows/NandyJACSAu2022/fragment_classes.py +586 -0
- workflows/NandyJACSAu2022/macrocycle_synthesis.py +179 -0
|
@@ -0,0 +1,1149 @@
|
|
|
1
|
+
# @file io.py
|
|
2
|
+
# Input/output functions
|
|
3
|
+
#
|
|
4
|
+
# Written by Tim Ioannidis for HJK Group
|
|
5
|
+
#
|
|
6
|
+
# Dpt of Chemical Engineering, MIT
|
|
7
|
+
|
|
8
|
+
import copy
|
|
9
|
+
import random
|
|
10
|
+
import re
|
|
11
|
+
import shutil
|
|
12
|
+
import glob
|
|
13
|
+
import os
|
|
14
|
+
import time
|
|
15
|
+
import difflib
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
from openbabel import openbabel # version 3 style import
|
|
19
|
+
except ImportError:
|
|
20
|
+
import openbabel # fallback to version 2
|
|
21
|
+
from typing import Any, List, Dict, Tuple, Union, Optional
|
|
22
|
+
from importlib_resources import files as resource_files
|
|
23
|
+
|
|
24
|
+
from molSimplify.Classes.globalvars import (globalvars,
|
|
25
|
+
romans)
|
|
26
|
+
from molSimplify.Classes.mol3D import mol3D
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Print available geometries
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def printgeoms():
|
|
33
|
+
globs = globalvars()
|
|
34
|
+
if globs.custom_path:
|
|
35
|
+
f = globs.custom_path + "/Data/coordinations.dict"
|
|
36
|
+
else:
|
|
37
|
+
f = resource_files("molSimplify").joinpath("Data/coordinations.dict")
|
|
38
|
+
with open(f, 'r') as f:
|
|
39
|
+
s = f.read().splitlines()
|
|
40
|
+
s = [_f for _f in s if _f]
|
|
41
|
+
geomnames = []
|
|
42
|
+
geomshorts = []
|
|
43
|
+
coords = []
|
|
44
|
+
for line in s:
|
|
45
|
+
if (line[0] != '#'):
|
|
46
|
+
vals = [_f for _f in re.split(',| |:', line) if _f]
|
|
47
|
+
coords.append(vals[0])
|
|
48
|
+
geomnames.append(vals[1])
|
|
49
|
+
geomshorts.append(vals[2])
|
|
50
|
+
geomgroups = list([] for a in set(coords))
|
|
51
|
+
for i, g in enumerate(coords):
|
|
52
|
+
geomgroups[int(g)-1].append(geomshorts[i])
|
|
53
|
+
for i, g in enumerate(geomnames):
|
|
54
|
+
print(("Coordination: %s, geometry: %s,\t short name: %s " %
|
|
55
|
+
(coords[i], g, geomshorts[i])))
|
|
56
|
+
print('')
|
|
57
|
+
|
|
58
|
+
# Get available geometries
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def getgeoms():
|
|
62
|
+
globs = globalvars()
|
|
63
|
+
if globs.custom_path:
|
|
64
|
+
f = globs.custom_path + "/Data/coordinations.dict"
|
|
65
|
+
else:
|
|
66
|
+
f = resource_files("molSimplify").joinpath("Data/coordinations.dict")
|
|
67
|
+
with open(f, 'r') as f:
|
|
68
|
+
s = f.read().splitlines()
|
|
69
|
+
s = [_f for _f in s if _f]
|
|
70
|
+
geomnames = []
|
|
71
|
+
geomshorts = []
|
|
72
|
+
coords = []
|
|
73
|
+
for line in s:
|
|
74
|
+
if (line[0] != '#'):
|
|
75
|
+
vals = [_f for _f in re.split(',| |:', line) if _f]
|
|
76
|
+
coords.append(vals[0]) # get coordination
|
|
77
|
+
geomnames.append(vals[1]) # get name of geometry
|
|
78
|
+
geomshorts.append(vals[2]) # get short names
|
|
79
|
+
geomgroups = list([] for a in set(coords)) # get unique coordinations
|
|
80
|
+
count = 0
|
|
81
|
+
geomgroups[count].append(geomshorts[0])
|
|
82
|
+
for i in range(1, len(coords)):
|
|
83
|
+
if coords[i-1] != coords[i]:
|
|
84
|
+
count += 1
|
|
85
|
+
geomgroups[count].append(geomshorts[i])
|
|
86
|
+
return coords, geomnames, geomshorts, geomgroups
|
|
87
|
+
|
|
88
|
+
# Read data into dictionary
|
|
89
|
+
# @param fname Filename containing dictionary data
|
|
90
|
+
# @return Dictionary
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def readdict(fname):
|
|
94
|
+
d = dict()
|
|
95
|
+
with open(fname, 'r') as f:
|
|
96
|
+
lines = [_f for _f in f.readlines() if _f]
|
|
97
|
+
for line in lines:
|
|
98
|
+
if (line[0] != '#') and line.strip():
|
|
99
|
+
key = "".join([_f for _f in line.split(':')[0] if _f])
|
|
100
|
+
val = "".join([_f for _f in line.split(':')[1] if _f])
|
|
101
|
+
vals = [_f.strip() for _f in val.split(',') if _f]
|
|
102
|
+
vv = []
|
|
103
|
+
for i, val in enumerate(vals):
|
|
104
|
+
vvs = [_f for _f in val.split(' ') if _f]
|
|
105
|
+
if len(vvs) > 1 or i > 2:
|
|
106
|
+
vv.append(vvs)
|
|
107
|
+
else:
|
|
108
|
+
vv += vvs
|
|
109
|
+
d[key] = vv
|
|
110
|
+
return d
|
|
111
|
+
|
|
112
|
+
# Read data into dictionary for substrate
|
|
113
|
+
# @param fname Filename containing dictionary data
|
|
114
|
+
# @return Dictionary
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def readdict_sub(fname):
|
|
118
|
+
d = dict()
|
|
119
|
+
with open(fname, 'r') as f:
|
|
120
|
+
txt = f.read()
|
|
121
|
+
lines = [_f for _f in txt.splitlines() if _f]
|
|
122
|
+
for line in lines:
|
|
123
|
+
if (line[0] != '#') and line.strip():
|
|
124
|
+
key = "".join([_f for _f in line.split(':')[0] if _f])
|
|
125
|
+
val = "".join([_f for _f in line.split(':')[1] if _f])
|
|
126
|
+
vals = [_f.strip() for _f in val.split(',') if _f]
|
|
127
|
+
vv = []
|
|
128
|
+
for i, val in enumerate(vals):
|
|
129
|
+
vvs = ([_f for _f in val.split(' ') if _f])
|
|
130
|
+
if len(vvs) > 1 or i > 2:
|
|
131
|
+
vv.append(vvs)
|
|
132
|
+
else:
|
|
133
|
+
vv += vvs
|
|
134
|
+
d[key] = vv
|
|
135
|
+
return d
|
|
136
|
+
|
|
137
|
+
# Get ligands in dictionary
|
|
138
|
+
# @return List of ligands in dictionary
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def getligs() -> str:
|
|
142
|
+
licores = getlicores()
|
|
143
|
+
return ' '.join(sorted(licores.keys()))
|
|
144
|
+
|
|
145
|
+
# Get ligands cores
|
|
146
|
+
#
|
|
147
|
+
# This form of the function is used extensively in the GUI so it got it's own call.
|
|
148
|
+
# This is basically the same as getligs() but returns the full dictionary
|
|
149
|
+
# @param flip if we want to return flipped versions of bidentates
|
|
150
|
+
# @return Ligands dictionary
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def getlicores(flip: bool = True) -> Dict[str, Any]:
|
|
154
|
+
globs = globalvars()
|
|
155
|
+
if globs.custom_path: # test if a custom path is used:
|
|
156
|
+
licores_path = str(globs.custom_path).rstrip('/') + "/Ligands/ligands.dict"
|
|
157
|
+
else:
|
|
158
|
+
licores_path = resource_files("molSimplify").joinpath("Ligands/ligands.dict")
|
|
159
|
+
licores = readdict(licores_path)
|
|
160
|
+
if flip:
|
|
161
|
+
for ligand in list(licores.keys()):
|
|
162
|
+
if len(licores[ligand][2]) == 2 and type(licores[ligand][2]) == list:
|
|
163
|
+
licores[ligand+'_flipped'] = copy.deepcopy(licores[ligand])
|
|
164
|
+
licores[ligand+'_flipped'][2].reverse()
|
|
165
|
+
return licores
|
|
166
|
+
|
|
167
|
+
# Get simple ligands in dictionary
|
|
168
|
+
# @return List of ligands in simple ligands dictionary
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def getsimpleligs() -> str:
|
|
172
|
+
slicores = getslicores()
|
|
173
|
+
return ' '.join(sorted(slicores.keys()))
|
|
174
|
+
|
|
175
|
+
# Get simple ligands cores
|
|
176
|
+
#
|
|
177
|
+
# This form of the function is used extensively in the GUI so it got it's own call.
|
|
178
|
+
# This is basically the same as getsimpleligs() but returns the full dictionary
|
|
179
|
+
# @return Simple ligands dictionary
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def getslicores() -> Dict[str, Any]:
|
|
183
|
+
globs = globalvars()
|
|
184
|
+
if globs.custom_path: # test if a custom path is used:
|
|
185
|
+
slicores_path = str(globs.custom_path).rstrip(
|
|
186
|
+
'/') + "/Ligands/simple_ligands.dict"
|
|
187
|
+
else:
|
|
188
|
+
slicores_path = resource_files("molSimplify").joinpath("Ligands/simple_ligands.dict")
|
|
189
|
+
slicores = readdict(slicores_path)
|
|
190
|
+
return slicores
|
|
191
|
+
|
|
192
|
+
# Get ligand groups
|
|
193
|
+
# @param licores Ligand dictionary
|
|
194
|
+
# @return Ligand groups
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def getligroups(licores: dict) -> str:
|
|
198
|
+
groups = []
|
|
199
|
+
for entry in licores:
|
|
200
|
+
groups += licores[entry][3]
|
|
201
|
+
groups = sorted(list(set(groups)))
|
|
202
|
+
a = ' '.join(groups)
|
|
203
|
+
return a
|
|
204
|
+
|
|
205
|
+
# Enclose metal elements in SMILES string with square brackets
|
|
206
|
+
# @param smi SMILES string
|
|
207
|
+
# @return Processed SMILES string
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def checkTMsmiles(smi: str) -> str:
|
|
211
|
+
g = globalvars()
|
|
212
|
+
for m in g.metalslist():
|
|
213
|
+
if m in smi:
|
|
214
|
+
smi = smi.replace(m, '['+m+']')
|
|
215
|
+
return smi
|
|
216
|
+
|
|
217
|
+
# Get binding species in dictionary
|
|
218
|
+
# @return List of binding species in dictionary
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def getbinds() -> str:
|
|
222
|
+
bindcores = getbcores()
|
|
223
|
+
return ' '.join(sorted(bindcores.keys()))
|
|
224
|
+
|
|
225
|
+
# Get binding species cores
|
|
226
|
+
#
|
|
227
|
+
# This form of the function is used extensively in the GUI so it got it's own call.
|
|
228
|
+
# This is basically the same as getbinds() but returns the full dictionary
|
|
229
|
+
# @return Binding species dictionary
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def getbcores() -> dict:
|
|
233
|
+
globs = globalvars()
|
|
234
|
+
if globs.custom_path: # test if a custom path is used:
|
|
235
|
+
bcores_path = str(globs.custom_path).rstrip('/') + "/Bind/bind.dict"
|
|
236
|
+
else:
|
|
237
|
+
bcores_path = resource_files("molSimplify").joinpath("Bind/bind.dict")
|
|
238
|
+
bcores = readdict(bcores_path)
|
|
239
|
+
return bcores
|
|
240
|
+
|
|
241
|
+
# Get cores in dictionary
|
|
242
|
+
# @return List of cores in dictionary
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def getcores():
|
|
246
|
+
mcores = getmcores()
|
|
247
|
+
a = []
|
|
248
|
+
for key in mcores:
|
|
249
|
+
a.append(key)
|
|
250
|
+
a = sorted(a)
|
|
251
|
+
a = ' '.join(a)
|
|
252
|
+
return a
|
|
253
|
+
|
|
254
|
+
# Get core cores
|
|
255
|
+
#
|
|
256
|
+
# This form of the function is used extensively in the GUI so it got it's own call.
|
|
257
|
+
# This is basically the same as getcores() but returns the full dictionary
|
|
258
|
+
# @return Cores dictionary
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def getmcores():
|
|
262
|
+
globs = globalvars()
|
|
263
|
+
if globs.custom_path: # test if a custom path is used:
|
|
264
|
+
mcores = str(globs.custom_path).rstrip('/') + "/Cores/cores.dict"
|
|
265
|
+
else:
|
|
266
|
+
mcores = resource_files("molSimplify").joinpath("Cores/cores.dict")
|
|
267
|
+
mcores = readdict(mcores)
|
|
268
|
+
return mcores
|
|
269
|
+
|
|
270
|
+
# Get substrates in dictionary
|
|
271
|
+
# @return List of substrates in dictionary
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def getsubstrates():
|
|
275
|
+
subcores = getsubcores()
|
|
276
|
+
a = []
|
|
277
|
+
for key in subcores:
|
|
278
|
+
a.append(key)
|
|
279
|
+
a = sorted(a)
|
|
280
|
+
a = ' '.join(a)
|
|
281
|
+
return a
|
|
282
|
+
|
|
283
|
+
# Get substrate cores
|
|
284
|
+
#
|
|
285
|
+
# This form of the function is used extensively in the GUI so it got it's own call.
|
|
286
|
+
# This is basically the same as getsubstrates() but returns the full dictionary
|
|
287
|
+
# @return Substrates dictionary
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def getsubcores():
|
|
291
|
+
globs = globalvars()
|
|
292
|
+
if globs.custom_path: # test if a custom path is used:
|
|
293
|
+
subcores = str(globs.custom_path).rstrip(
|
|
294
|
+
'/') + "/Substrates/substrates.dict"
|
|
295
|
+
else:
|
|
296
|
+
subcores = resource_files("molSimplify").joinpath("Substrates/substrates.dict")
|
|
297
|
+
subcores = readdict_sub(subcores)
|
|
298
|
+
return subcores
|
|
299
|
+
|
|
300
|
+
# Load M-L bond length dictionary from data
|
|
301
|
+
# @param path to data file
|
|
302
|
+
# @return M-L bond length dictionary
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def loaddata(path: str) -> dict:
|
|
306
|
+
globs = globalvars()
|
|
307
|
+
# loads ML data from ML.dat file and
|
|
308
|
+
# store to dictionary
|
|
309
|
+
if globs.custom_path: # test if a custom path is used:
|
|
310
|
+
fname = str(globs.custom_path).rstrip('/') + path
|
|
311
|
+
else:
|
|
312
|
+
fname = resource_files("molSimplify").joinpath(path.strip('/'))
|
|
313
|
+
d = dict()
|
|
314
|
+
|
|
315
|
+
with open(fname) as f:
|
|
316
|
+
txt = f.read()
|
|
317
|
+
lines = [_f for _f in txt.splitlines() if _f]
|
|
318
|
+
for line in lines[1:]:
|
|
319
|
+
if '#' != line[0]: # skip comments
|
|
320
|
+
s = [_f for _f in line.split(None) if _f]
|
|
321
|
+
d[(s[0], s[1], s[2], s[3], s[4])] = s[5] # read dictionary
|
|
322
|
+
return d
|
|
323
|
+
|
|
324
|
+
# Load M-L bond length dictionary from data
|
|
325
|
+
# @param path to data file
|
|
326
|
+
# @return M-L bond length dictionary
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
def loaddata_ts(path: str) -> dict:
|
|
330
|
+
globs = globalvars()
|
|
331
|
+
# loads ML data from ML.dat file and
|
|
332
|
+
# store to dictionary
|
|
333
|
+
if globs.custom_path: # test if a custom path is used:
|
|
334
|
+
fname = str(globs.custom_path).rstrip('/') + path
|
|
335
|
+
else:
|
|
336
|
+
fname = resource_files("molSimplify").joinpath(path.strip('/'))
|
|
337
|
+
d = dict()
|
|
338
|
+
|
|
339
|
+
with open(fname) as f:
|
|
340
|
+
txt = f.read()
|
|
341
|
+
lines = [_f for _f in txt.splitlines() if _f]
|
|
342
|
+
for line in lines[1:]:
|
|
343
|
+
if '#' != line[0]: # skip comments
|
|
344
|
+
s = [_f for _f in line.split(None) if _f]
|
|
345
|
+
d[(s[0], s[1], s[2], s[3])] = s[4:] # read dictionary
|
|
346
|
+
return d
|
|
347
|
+
|
|
348
|
+
# Load a chemdraw cdxml file and write out xyz
|
|
349
|
+
# @param cdxml a cdxml file
|
|
350
|
+
# return fname the xyz fname for the read-in cdxml
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def loadcdxml(cdxml: str) -> Tuple[str, str]:
|
|
354
|
+
# try importing pybel
|
|
355
|
+
try:
|
|
356
|
+
import pybel
|
|
357
|
+
except ImportError: # What is the purpose of excepting and then raising?
|
|
358
|
+
raise
|
|
359
|
+
fname = re.sub(r'.cdxml', '', cdxml) # file name for the new xyz
|
|
360
|
+
# check cdxml file for Dashed bonds
|
|
361
|
+
with open(cdxml, 'r') as f:
|
|
362
|
+
lines = f.read().splitlines()
|
|
363
|
+
signal = False
|
|
364
|
+
for i, line in enumerate(lines):
|
|
365
|
+
if 'Dash' in line:
|
|
366
|
+
lnum = i
|
|
367
|
+
signal = True
|
|
368
|
+
break
|
|
369
|
+
# remove the dash bond
|
|
370
|
+
if signal:
|
|
371
|
+
cdxml = cdxml.replace('.cdxml', '.temp.cdxml')
|
|
372
|
+
with open(cdxml, 'a') as f:
|
|
373
|
+
if signal:
|
|
374
|
+
for i, line in enumerate(lines):
|
|
375
|
+
if i not in list(range(lnum-5, lnum+2)):
|
|
376
|
+
f.write(line + '\n')
|
|
377
|
+
else:
|
|
378
|
+
for i, line in enumerate(lines):
|
|
379
|
+
f.write(line + '\n')
|
|
380
|
+
# load cdxml into obmol
|
|
381
|
+
obconv = openbabel.OBConversion() # ob Class
|
|
382
|
+
obmol = openbabel.OBMol() # ob Class
|
|
383
|
+
obconv.SetInFormat('cdxml') # ob Method to set cdxml
|
|
384
|
+
obconv.ReadFile(obmol, cdxml) # ob Method to reaad cdxml into a OBMol()
|
|
385
|
+
if signal:
|
|
386
|
+
os.remove(cdxml)
|
|
387
|
+
# substitute Si for metals
|
|
388
|
+
obmol.NumAtoms()
|
|
389
|
+
idx_list = []
|
|
390
|
+
atno_list = []
|
|
391
|
+
for idx in range(obmol.NumAtoms()):
|
|
392
|
+
if obmol.GetAtom(idx+1).IsMetal():
|
|
393
|
+
idx_list.append(idx)
|
|
394
|
+
atno_list.append(obmol.GetAtom(idx+1).GetAtomicNum())
|
|
395
|
+
obmol.GetAtom(idx+1).SetAtomicNum(14)
|
|
396
|
+
# convert 2D to 3D
|
|
397
|
+
pymol = pybel.Molecule(obmol)
|
|
398
|
+
pymol.make3D()
|
|
399
|
+
pymol.localopt()
|
|
400
|
+
# recover metal symbols
|
|
401
|
+
for i in range(len(idx_list)):
|
|
402
|
+
idx = idx_list[i]
|
|
403
|
+
atno = atno_list[i]
|
|
404
|
+
obmol.GetAtom(idx+1).SetAtomicNum(atno)
|
|
405
|
+
# determine the number of fragments in obmol
|
|
406
|
+
mol = mol3D()
|
|
407
|
+
mol.OBMol = obmol
|
|
408
|
+
mol.convert2mol3D()
|
|
409
|
+
fraglist = mol.getfragmentlists()
|
|
410
|
+
# write xyzfs
|
|
411
|
+
msg = ''
|
|
412
|
+
if len(fraglist) > 1:
|
|
413
|
+
for atidxes in fraglist:
|
|
414
|
+
frag = mol3D()
|
|
415
|
+
for atidx in atidxes:
|
|
416
|
+
atom = mol.getAtom(atidx)
|
|
417
|
+
frag.addAtom(atom)
|
|
418
|
+
if len(frag.findMetal()) > 0:
|
|
419
|
+
frag.writexyz(fname + '_cat.xyz')
|
|
420
|
+
else:
|
|
421
|
+
frag.writexyz(fname + '_sub.xyz')
|
|
422
|
+
msg = 'two fragments were saved individually as xyzf'
|
|
423
|
+
else:
|
|
424
|
+
mol.writexyz(fname + '.xyz')
|
|
425
|
+
msg = 'one molecule was saved as xyzf'
|
|
426
|
+
|
|
427
|
+
return fname, msg
|
|
428
|
+
|
|
429
|
+
# Load backbone coordinates
|
|
430
|
+
# @param coord Name of coordination geometry
|
|
431
|
+
# @return List of backbone coordinates
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
def loadcoord(coord: str) -> List[List[float]]:
|
|
435
|
+
globs = globalvars()
|
|
436
|
+
if globs.custom_path:
|
|
437
|
+
f = globs.custom_path + "/Data/" + coord + ".dat"
|
|
438
|
+
else:
|
|
439
|
+
f = resource_files("molSimplify").joinpath(f"Data/{coord}.dat")
|
|
440
|
+
with open(f) as f:
|
|
441
|
+
txt = [_f for _f in f.read().splitlines() if _f]
|
|
442
|
+
b = []
|
|
443
|
+
for line in txt:
|
|
444
|
+
s = [_f for _f in line.split(None) if _f]
|
|
445
|
+
b.append([float(s[0]), float(s[1]), float(s[2])])
|
|
446
|
+
return b
|
|
447
|
+
|
|
448
|
+
# Load core and convert to mol3D
|
|
449
|
+
# @param usercore Name of core
|
|
450
|
+
# @param mcores Cores dictionary (reloads if not specified - default, useful when using an externally modified dictionary)
|
|
451
|
+
# @return mol3D of core, error messages
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
def core_load(usercore: str, mcores: Optional[dict] = None) -> Tuple[Union[mol3D, None], str]:
|
|
455
|
+
if mcores is None:
|
|
456
|
+
mcores = getmcores()
|
|
457
|
+
globs = globalvars()
|
|
458
|
+
if '~' in usercore:
|
|
459
|
+
homedir = os.path.expanduser("~")
|
|
460
|
+
usercore = usercore.replace('~', homedir)
|
|
461
|
+
emsg = ''
|
|
462
|
+
core = mol3D() # initialize core molecule
|
|
463
|
+
# check if core exists in dictionary
|
|
464
|
+
if usercore.lower() in list(mcores.keys()):
|
|
465
|
+
# print('loading core from dictionary')
|
|
466
|
+
dbentry = mcores[usercore.lower()]
|
|
467
|
+
# load core mol file (with hydrogens
|
|
468
|
+
if globs.custom_path:
|
|
469
|
+
fcore = globs.custom_path + "/Cores/" + dbentry[0]
|
|
470
|
+
else:
|
|
471
|
+
fcore = str(resource_files("molSimplify").joinpath(f"Cores/{dbentry[0]}"))
|
|
472
|
+
# check if core xyz/mol file exists
|
|
473
|
+
if not glob.glob(fcore):
|
|
474
|
+
emsg = "We can't find the core structure file %s right now! Something is amiss. Exiting..\n" % fcore
|
|
475
|
+
print(emsg)
|
|
476
|
+
return None, emsg
|
|
477
|
+
if ('.xyz' in fcore):
|
|
478
|
+
core.OBMol = core.getOBMol(fcore, 'xyzf')
|
|
479
|
+
elif ('.mol' in fcore):
|
|
480
|
+
core.OBMol = core.getOBMol(fcore, 'molf')
|
|
481
|
+
elif ('.smi' in fcore):
|
|
482
|
+
core.OBMol = core.getOBMol(fcore, 'smif')
|
|
483
|
+
core.cat = [int(i) for i in [_f for _f in dbentry[1] if _f]]
|
|
484
|
+
core.denticity = dbentry[2]
|
|
485
|
+
core.ident = usercore
|
|
486
|
+
# load from file
|
|
487
|
+
elif ('.mol' in usercore or '.xyz' in usercore or '.smi' in usercore):
|
|
488
|
+
if glob.glob(usercore):
|
|
489
|
+
ftype = usercore.split('.')[-1]
|
|
490
|
+
print(('Core is a '+ftype+' file'))
|
|
491
|
+
# try and catch error if conversion doesn't work
|
|
492
|
+
try:
|
|
493
|
+
core.OBMol = core.getOBMol(
|
|
494
|
+
usercore, ftype+'f') # convert from file
|
|
495
|
+
print('Core successfully converted to OBMol')
|
|
496
|
+
except IOError:
|
|
497
|
+
emsg = 'Failed converting file ' + usercore+' to molecule..Check your file.\n'
|
|
498
|
+
print(emsg)
|
|
499
|
+
return None, emsg
|
|
500
|
+
core.ident = usercore.split('.')[0]
|
|
501
|
+
core.ident = core.ident.rsplit('/')[-1]
|
|
502
|
+
else:
|
|
503
|
+
emsg = 'Core file '+usercore+' does not exist. Exiting..\n'
|
|
504
|
+
print(emsg)
|
|
505
|
+
return None, emsg
|
|
506
|
+
# if not, try converting from SMILES
|
|
507
|
+
else:
|
|
508
|
+
# check for transition metals
|
|
509
|
+
usercore = checkTMsmiles(usercore)
|
|
510
|
+
# try and catch error if conversion doesn't work
|
|
511
|
+
try:
|
|
512
|
+
core.OBMol = core.getOBMol(
|
|
513
|
+
usercore, 'smistring', True) # convert from smiles
|
|
514
|
+
print('Core successfully interpreted as smiles')
|
|
515
|
+
except IOError:
|
|
516
|
+
emsg = "We tried converting the string '%s' to a molecule but it wasn't a valid SMILES string.\n" % usercore
|
|
517
|
+
emsg += "Furthermore, we couldn't find the core structure: '%s' in the cores dictionary. Try again!\n" % usercore
|
|
518
|
+
emsg += "\nAvailable cores are: %s\n" % getcores()
|
|
519
|
+
print(emsg)
|
|
520
|
+
return None, emsg
|
|
521
|
+
core.cat = [0]
|
|
522
|
+
core.denticity = 1
|
|
523
|
+
core.ident = 'core'
|
|
524
|
+
return core, emsg
|
|
525
|
+
|
|
526
|
+
# Load substrate and convert to mol3D
|
|
527
|
+
# @param usersubstrate Name of substrate
|
|
528
|
+
# @param subcores Substrates dictionary
|
|
529
|
+
# (reloads if not specified - default, useful when using an externally modified dictionary)
|
|
530
|
+
# @return mol3D of substrate, subscatom, error messages
|
|
531
|
+
# attributes of substrate: OBMol, denticity, ident (identity), charge,
|
|
532
|
+
# cat (connection atom index), and grps (substrate group)
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
def substr_load(usersubstrate: str,
|
|
536
|
+
sub_i: int,
|
|
537
|
+
subcatoms: List[int],
|
|
538
|
+
subcores: Optional[dict] = None) -> Tuple[Union[mol3D, None], List[int], str]:
|
|
539
|
+
# if not using a user-defined substrate dictionary
|
|
540
|
+
if subcores is None:
|
|
541
|
+
subcores = getsubcores()
|
|
542
|
+
# load global variables
|
|
543
|
+
globs = globalvars()
|
|
544
|
+
if '~' in usersubstrate:
|
|
545
|
+
homedir = os.path.expanduser("~")
|
|
546
|
+
usersubstrate = usersubstrate.replace('~', homedir)
|
|
547
|
+
emsg = ''
|
|
548
|
+
sub = mol3D() # initialize core molecule
|
|
549
|
+
# default attributes of the sub3D
|
|
550
|
+
sub.denticity = 1
|
|
551
|
+
sub.ident = None
|
|
552
|
+
sub.charge = 0
|
|
553
|
+
sub.cat = [0]
|
|
554
|
+
sub.grps = ['inter']
|
|
555
|
+
# check if substrate exists in dictionary
|
|
556
|
+
if usersubstrate.lower() in [i.subname for i in list(subcores.keys())]:
|
|
557
|
+
print('loading substrate from dictionary')
|
|
558
|
+
# create a list for each item column in the dictionary
|
|
559
|
+
var_list = []
|
|
560
|
+
for var in [subcores[i][0:] for i in list(subcores.keys()) if i.subname == usersubstrate.lower()]:
|
|
561
|
+
var_list.append(var)
|
|
562
|
+
var_list = sorted(var_list)
|
|
563
|
+
var_list_sub_i = var_list[sub_i]
|
|
564
|
+
if globs.custom_path:
|
|
565
|
+
fsubst = globs.custom_path + "/Substrates/" + var_list_sub_i[0]
|
|
566
|
+
else:
|
|
567
|
+
fsubst = str(resource_files("molSimplify").joinpath(f"Substrates/{var_list_sub_i[0]}"))
|
|
568
|
+
# check if substrate xyz/mol file exists
|
|
569
|
+
if not glob.glob(fsubst):
|
|
570
|
+
emsg = "We can't find the substrate structure file %s right now! Something is amiss. Exiting..\n" % fsubst
|
|
571
|
+
print(emsg)
|
|
572
|
+
return None, subcatoms, emsg
|
|
573
|
+
if ('.xyz' in fsubst):
|
|
574
|
+
sub.OBMol = sub.getOBMol(fsubst, 'xyzf')
|
|
575
|
+
elif ('.mol' in fsubst):
|
|
576
|
+
sub.OBMol = sub.getOBMol(fsubst, 'molf')
|
|
577
|
+
elif ('.smi' in fsubst):
|
|
578
|
+
sub.OBMol = sub.getOBMol(fsubst, 'smif')
|
|
579
|
+
# Parsing substrate denticity
|
|
580
|
+
# modified the check for length,
|
|
581
|
+
# as it parsing string length instead of
|
|
582
|
+
# list length!
|
|
583
|
+
if isinstance(var_list_sub_i[2], str):
|
|
584
|
+
sub.denticity = 1
|
|
585
|
+
else:
|
|
586
|
+
sub.denticity = len(var_list_sub_i[2])
|
|
587
|
+
# Parsing substrate identity
|
|
588
|
+
sub.ident = var_list_sub_i[1]
|
|
589
|
+
# Parsing substrate charge
|
|
590
|
+
sub.charge = sub.OBMol.GetTotalCharge()
|
|
591
|
+
# Parsing substrate connection atoms
|
|
592
|
+
if 'pi' in var_list_sub_i[2]:
|
|
593
|
+
sub.denticity = 1
|
|
594
|
+
sub.cat = [int(li) for li in var_list_sub_i[2][:-1]]
|
|
595
|
+
sub.cat.append('pi')
|
|
596
|
+
else:
|
|
597
|
+
sub.cat = [int(li) for li in var_list_sub_i[2]]
|
|
598
|
+
if not subcatoms:
|
|
599
|
+
subcatoms = sub.cat
|
|
600
|
+
# Parsing substrate group
|
|
601
|
+
sub.grps = [li for li in var_list_sub_i[3]]
|
|
602
|
+
if len(var_list_sub_i[4]) > 0:
|
|
603
|
+
sub.ffopt = var_list_sub_i[4]
|
|
604
|
+
# load from file
|
|
605
|
+
elif ('.mol' in usersubstrate or '.xyz' in usersubstrate or '.smi' in usersubstrate):
|
|
606
|
+
if glob.glob(usersubstrate):
|
|
607
|
+
ftype = usersubstrate.split('.')[-1]
|
|
608
|
+
print(('Substrate is a '+ftype+' file'))
|
|
609
|
+
# try and catch error if conversion doesn't work
|
|
610
|
+
try:
|
|
611
|
+
sub.OBMol = sub.getOBMol(
|
|
612
|
+
usersubstrate, ftype+'f') # convert from file
|
|
613
|
+
print('Substrate successfully converted to OBMol')
|
|
614
|
+
|
|
615
|
+
except IOError:
|
|
616
|
+
emsg = 'Failed converting file ' + usersubstrate + \
|
|
617
|
+
' to molecule..Check your file.\n'
|
|
618
|
+
print(emsg)
|
|
619
|
+
return None, subcatoms, emsg
|
|
620
|
+
sub.ident = usersubstrate.split('/')[-1].split('.')[0]
|
|
621
|
+
else:
|
|
622
|
+
emsg = 'Substrate file '+usersubstrate+' does not exist. Exiting..\n'
|
|
623
|
+
print(emsg)
|
|
624
|
+
return None, subcatoms, emsg
|
|
625
|
+
# if not, try converting from SMILES
|
|
626
|
+
else:
|
|
627
|
+
# check for transition metals
|
|
628
|
+
usersubstrate = checkTMsmiles(usersubstrate)
|
|
629
|
+
# try and catch error if conversion doesn't work
|
|
630
|
+
try:
|
|
631
|
+
sub.OBMol = sub.getOBMol(
|
|
632
|
+
usersubstrate, 'smistring', True) # convert from smiles
|
|
633
|
+
print('Substrate successfully interpreted as smiles')
|
|
634
|
+
except IOError:
|
|
635
|
+
emsg = f"We tried converting the string '{usersubstrate}' to a molecule but it wasn't a valid SMILES string.\n"
|
|
636
|
+
emsg += f"Furthermore, we couldn't find the substrate structure: '{usersubstrate}' in the substrates dictionary. "
|
|
637
|
+
emsg += f"Try again!\n\nAvailable substrates are: {getsubstrates()}\n"
|
|
638
|
+
print(emsg)
|
|
639
|
+
return None, subcatoms, emsg
|
|
640
|
+
sub.cat = [0]
|
|
641
|
+
sub.denticity = 1
|
|
642
|
+
sub.ident = 'substrate'
|
|
643
|
+
return sub, subcatoms, emsg
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
# TODO: Output currently typed as any instead of Union[mol3D, None] because many other
|
|
647
|
+
# scripts depend on a mol3D as first return value.
|
|
648
|
+
def lig_load(userligand: str, licores: Optional[dict] = None) -> Tuple[Any, str]:
|
|
649
|
+
|
|
650
|
+
if licores is None:
|
|
651
|
+
licores = getlicores()
|
|
652
|
+
# @licores.pop("x", None)
|
|
653
|
+
globs = globalvars()
|
|
654
|
+
# ## get groups ###
|
|
655
|
+
groups = []
|
|
656
|
+
for entry in licores:
|
|
657
|
+
groups += licores[entry][3]
|
|
658
|
+
groups = sorted(list(set(groups)))
|
|
659
|
+
# check if user requested group
|
|
660
|
+
if userligand.lower() in groups:
|
|
661
|
+
subligs = [key for key in licores if userligand.lower()
|
|
662
|
+
in licores[key][3]]
|
|
663
|
+
# randomly select ligand
|
|
664
|
+
userligand = random.choice(subligs)
|
|
665
|
+
if '~' in userligand:
|
|
666
|
+
homedir = os.path.expanduser("~")
|
|
667
|
+
userligand = userligand.replace('~', homedir)
|
|
668
|
+
emsg = ''
|
|
669
|
+
lig = mol3D() # initialize ligand molecule
|
|
670
|
+
lig.needsconformer = False
|
|
671
|
+
# get similarity of userligand to ligands in dictionary, from the sequence point of view
|
|
672
|
+
text_similarities = [difflib.SequenceMatcher(None, userligand, i).ratio() for i in list(licores.keys())]
|
|
673
|
+
# check if ligand exists in dictionary
|
|
674
|
+
if userligand in list(licores.keys()) or max(text_similarities) > 0.6: # Two cases here
|
|
675
|
+
if userligand in list(licores.keys()): # Ligand is in the dictionary ligands.dict
|
|
676
|
+
print(('loading ligand from dictionary: ' + str(userligand)))
|
|
677
|
+
dbentry = licores[userligand]
|
|
678
|
+
else:
|
|
679
|
+
# max(text_similarities) > 0.6 --> It is likely the user made a typo in inputting a ligand that is in ligands.dict
|
|
680
|
+
max_similarity = max(text_similarities)
|
|
681
|
+
index_max = text_similarities.index(max_similarity)
|
|
682
|
+
desired_ligand = list(licores.keys())[index_max]
|
|
683
|
+
print(f'ligand was not in dictionary, but the sequence is very similar to a ligand that is: {str(desired_ligand)}')
|
|
684
|
+
print(('loading ligand from dictionary: ' + str(desired_ligand)))
|
|
685
|
+
dbentry = licores[desired_ligand] # Loading the typo-d ligand
|
|
686
|
+
# load lig mol file (with hydrogens)
|
|
687
|
+
if globs.custom_path:
|
|
688
|
+
flig = globs.custom_path + "/Ligands/" + dbentry[0]
|
|
689
|
+
else:
|
|
690
|
+
flig = str(resource_files("molSimplify").joinpath(f"Ligands/{dbentry[0]}"))
|
|
691
|
+
# check if ligand xyz/mol file exists
|
|
692
|
+
print(('looking for '+flig))
|
|
693
|
+
if not os.path.isfile(flig):
|
|
694
|
+
emsg = "We can't find the ligand structure file %s right now! Something is amiss. Exiting..\n" % flig
|
|
695
|
+
print(emsg)
|
|
696
|
+
return False, emsg
|
|
697
|
+
if ('.xyz' in flig):
|
|
698
|
+
lig.OBMol = lig.getOBMol(flig, 'xyzf')
|
|
699
|
+
# Set charge to last entry in ligands.dict
|
|
700
|
+
lig.OBMol.SetTotalCharge(int(dbentry[-1][0]))
|
|
701
|
+
elif ('.mol2' in flig):
|
|
702
|
+
lig.OBMol = lig.getOBMol(flig, 'mol2f')
|
|
703
|
+
elif ('.mol' in flig):
|
|
704
|
+
lig.OBMol = lig.getOBMol(flig, 'molf')
|
|
705
|
+
elif ('.smi' in flig):
|
|
706
|
+
print('SMILES conversion')
|
|
707
|
+
lig.OBMol = lig.getOBMol(flig, 'smif')
|
|
708
|
+
lig.needsconformer = True
|
|
709
|
+
|
|
710
|
+
# modified the check for length,
|
|
711
|
+
# as it parsing string length instead of
|
|
712
|
+
# list length!
|
|
713
|
+
if isinstance(dbentry[2], str):
|
|
714
|
+
lig.denticity = 1
|
|
715
|
+
else:
|
|
716
|
+
lig.denticity = len(dbentry[2])
|
|
717
|
+
lig.ident = dbentry[1]
|
|
718
|
+
lig.convert2mol3D()
|
|
719
|
+
lig.charge = lig.OBMol.GetTotalCharge()
|
|
720
|
+
if 'pi' in dbentry[2]:
|
|
721
|
+
lig.cat = [int(li) for li in dbentry[2][:-1]]
|
|
722
|
+
lig.cat.append('pi')
|
|
723
|
+
else:
|
|
724
|
+
if lig.denticity == 1:
|
|
725
|
+
lig.cat = [int(dbentry[2])]
|
|
726
|
+
else:
|
|
727
|
+
lig.cat = [int(li) for li in dbentry[2]]
|
|
728
|
+
if lig.denticity > 1:
|
|
729
|
+
lig.grps = dbentry[3]
|
|
730
|
+
else:
|
|
731
|
+
lig.grps = []
|
|
732
|
+
if len(dbentry) > 3:
|
|
733
|
+
lig.ffopt = dbentry[4][0]
|
|
734
|
+
# load from file
|
|
735
|
+
elif ('.mol' in userligand or '.xyz' in userligand or '.smi' in userligand or '.sdf' in userligand):
|
|
736
|
+
if glob.glob(userligand):
|
|
737
|
+
ftype = userligand.split('.')[-1]
|
|
738
|
+
# try and catch error if conversion doesn't work
|
|
739
|
+
try:
|
|
740
|
+
print(('ligand is an '+ftype+' file'))
|
|
741
|
+
lig.OBMol = lig.getOBMol(
|
|
742
|
+
userligand, ftype+'f') # convert from file
|
|
743
|
+
# generate coordinates if not existing
|
|
744
|
+
lig.charge = lig.OBMol.GetTotalCharge()
|
|
745
|
+
print('Ligand successfully converted to OBMol')
|
|
746
|
+
except IOError:
|
|
747
|
+
emsg = 'Failed converting file ' + userligand+' to molecule..Check your file.\n'
|
|
748
|
+
return False, emsg
|
|
749
|
+
lig.ident = userligand.rsplit('/')[-1]
|
|
750
|
+
lig.ident = lig.ident.split('.'+ftype)[0]
|
|
751
|
+
else:
|
|
752
|
+
emsg = 'Ligand file '+userligand+' does not exist. Exiting..\n'
|
|
753
|
+
print(emsg)
|
|
754
|
+
return False, emsg
|
|
755
|
+
# if not, try interpreting as SMILES string
|
|
756
|
+
else:
|
|
757
|
+
print(f'Interpreting ligand {userligand} as a SMILES string, as it was not in the ligands dictionary.')
|
|
758
|
+
print('Available ligands in the ligands dictionary can be found at molSimplify/molSimplify/Ligands/ligands.dict\n'
|
|
759
|
+
'Or by running the command `molsimplify -h liganddict`')
|
|
760
|
+
try:
|
|
761
|
+
lig.getOBMol(userligand, 'smistring', True) # convert from smiles
|
|
762
|
+
lig.convert2mol3D()
|
|
763
|
+
assert lig.natoms
|
|
764
|
+
lig.charge = lig.OBMol.GetTotalCharge()
|
|
765
|
+
print('Ligand successfully interpreted as SMILES')
|
|
766
|
+
except IOError:
|
|
767
|
+
emsg = f"We tried converting the string '{userligand}' to a molecule but it wasn't a valid SMILES string.\n"
|
|
768
|
+
emsg += f"Furthermore, we couldn't find the ligand structure: '{userligand}' in the ligands dictionary. "
|
|
769
|
+
emsg += f"Try again!\n\nAvailable ligands are: {getligs()}\n"
|
|
770
|
+
emsg += f"\nAnd available groups are: {getligroups(licores)}\n"
|
|
771
|
+
print(emsg)
|
|
772
|
+
return False, emsg
|
|
773
|
+
lig.ident = 'smi'
|
|
774
|
+
lig.needsconformer = True
|
|
775
|
+
lig.name = userligand
|
|
776
|
+
return lig, emsg
|
|
777
|
+
|
|
778
|
+
# Load binding species and convert to mol3D
|
|
779
|
+
# @param userbind Name of binding species
|
|
780
|
+
# @param bindcores Binding species dictionary
|
|
781
|
+
# (reloads if not specified - default, useful when using an externally modified dictionary)
|
|
782
|
+
# @return mol3D of binding species, error messages
|
|
783
|
+
|
|
784
|
+
|
|
785
|
+
def bind_load(userbind: str, bindcores: dict) -> Tuple[Union[mol3D, None], bool, str]:
|
|
786
|
+
globs = globalvars()
|
|
787
|
+
if '~' in userbind:
|
|
788
|
+
homedir = os.path.expanduser("~")
|
|
789
|
+
userbind = userbind.replace('~', homedir)
|
|
790
|
+
emsg = ''
|
|
791
|
+
bind = mol3D() # initialize binding molecule
|
|
792
|
+
bsmi = False # flag for smiles
|
|
793
|
+
# check if binding molecule exists in dictionary
|
|
794
|
+
if userbind in list(bindcores.keys()):
|
|
795
|
+
# load bind mol file (with hydrogens)
|
|
796
|
+
# fbind = installdir+'Bind/'+bindcores[userbind][0]
|
|
797
|
+
if globs.custom_path:
|
|
798
|
+
fbind = globs.custom_path + "/Bind/" + bindcores[userbind][0]
|
|
799
|
+
else:
|
|
800
|
+
fbind = str(resource_files("molSimplify").joinpath(f"Bind/{bindcores[userbind][0]}"))
|
|
801
|
+
# check if bind xyz/mol file exists
|
|
802
|
+
if not glob.glob(fbind):
|
|
803
|
+
emsg = "We can't find the binding species structure file %s right now! Something is amiss. Exiting..\n" % fbind
|
|
804
|
+
print(emsg)
|
|
805
|
+
return None, False, emsg
|
|
806
|
+
if ('.xyz' in fbind):
|
|
807
|
+
bind.OBMol = bind.getOBMol(fbind, 'xyzf')
|
|
808
|
+
elif ('.mol' in fbind):
|
|
809
|
+
bind.OBMol = bind.getOBMol(fbind, 'molf')
|
|
810
|
+
elif ('.smi' in fbind):
|
|
811
|
+
bind.OBMol = bind.getOBMol(fbind, 'smif')
|
|
812
|
+
bind.charge = bind.OBMol.GetTotalCharge()
|
|
813
|
+
# load from file
|
|
814
|
+
elif ('.mol' in userbind or '.xyz' in userbind or '.smi' in userbind):
|
|
815
|
+
if glob.glob(userbind):
|
|
816
|
+
ftype = userbind.split('.')[-1]
|
|
817
|
+
# try and catch error if conversion doesn't work
|
|
818
|
+
try:
|
|
819
|
+
bind.OBMol = bind.getOBMol(
|
|
820
|
+
userbind, ftype+'f') # convert from file
|
|
821
|
+
bind.charge = bind.OBMol.GetTotalCharge()
|
|
822
|
+
except IOError:
|
|
823
|
+
emsg = 'Failed converting file ' + userbind+' to molecule..Check your file.\n'
|
|
824
|
+
return None, False, emsg
|
|
825
|
+
bind.ident = userbind.rsplit('/')[-1]
|
|
826
|
+
bind.ident = bind.ident.split('.'+ftype)[0]
|
|
827
|
+
else:
|
|
828
|
+
emsg = 'Binding species file '+userbind+' does not exist. Exiting..\n'
|
|
829
|
+
return None, False, emsg
|
|
830
|
+
# if not, try converting from SMILES
|
|
831
|
+
else:
|
|
832
|
+
# check for transition metals
|
|
833
|
+
userbind = checkTMsmiles(userbind)
|
|
834
|
+
# try and catch error if conversion doesn't work
|
|
835
|
+
try:
|
|
836
|
+
bind.OBMol = bind.getOBMol(userbind, 'smi') # convert from smiles
|
|
837
|
+
bind.charge = bind.OBMol.GetTotalCharge()
|
|
838
|
+
bsmi = True
|
|
839
|
+
bind.ident = 'smi'
|
|
840
|
+
except IOError:
|
|
841
|
+
emsg = "We tried converting the string '%s' to a molecule but it wasn't a valid SMILES string.\n" % userbind
|
|
842
|
+
emsg += "Furthermore, we couldn't find the binding species structure: "
|
|
843
|
+
emsg += "'%s' in the binding species dictionary. Try again!\n" % userbind
|
|
844
|
+
print(emsg)
|
|
845
|
+
return None, False, emsg
|
|
846
|
+
return bind, bsmi, emsg
|
|
847
|
+
|
|
848
|
+
# Write input file from arguments
|
|
849
|
+
# @param args Namespace of arguments
|
|
850
|
+
# @param fname File name
|
|
851
|
+
|
|
852
|
+
|
|
853
|
+
def getinputargs(args, fname: str):
|
|
854
|
+
# list with arguments
|
|
855
|
+
# write input args
|
|
856
|
+
with open(fname+'.molinp', 'w') as f:
|
|
857
|
+
f.write("# Input file generated from molSimplify at " +
|
|
858
|
+
time.strftime('%m/%d/%Y %H:%M')+'\n')
|
|
859
|
+
for arg in vars(args):
|
|
860
|
+
if 'nbind' not in arg and 'rgen' not in arg and 'i' != arg:
|
|
861
|
+
if getattr(args, arg):
|
|
862
|
+
f.write('-'+arg+' ')
|
|
863
|
+
if isinstance(getattr(args, arg), list):
|
|
864
|
+
for ii, iar in enumerate(getattr(args, arg)):
|
|
865
|
+
if isinstance(iar, list):
|
|
866
|
+
if ii < len(getattr(args, arg))-1:
|
|
867
|
+
f.write('/')
|
|
868
|
+
for jj, iiar in enumerate(iar):
|
|
869
|
+
f.write(str(iiar))
|
|
870
|
+
if jj < len(iar)-1:
|
|
871
|
+
f.write(',')
|
|
872
|
+
else:
|
|
873
|
+
f.write(str(iar))
|
|
874
|
+
if ii < len(getattr(args, arg))-1:
|
|
875
|
+
f.write(',')
|
|
876
|
+
else:
|
|
877
|
+
f.write(str(getattr(args, arg)))
|
|
878
|
+
f.write('\n')
|
|
879
|
+
|
|
880
|
+
# Load plugin definitions
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
def plugin_defs() -> str:
|
|
884
|
+
plugin_path = str(resource_files("molSimplify").joinpath("plugindefines_reference.txt"))
|
|
885
|
+
return plugin_path
|
|
886
|
+
|
|
887
|
+
# def get_name(args,rootdir,core,ligname,bind = False,bsmi = False):
|
|
888
|
+
# DEPRECIATED, USE NAME_COMPLEX instead
|
|
889
|
+
# reads in argument namespace
|
|
890
|
+
# and chooses an appropriate name
|
|
891
|
+
# bind_ident is used to pass binding
|
|
892
|
+
# species information
|
|
893
|
+
# print('the root directory for this calc is '+ (rootdir))
|
|
894
|
+
# check if smiles string in binding species
|
|
895
|
+
# if args.bind:
|
|
896
|
+
# if bsmi:
|
|
897
|
+
# if args.nambsmi: # if name specified use it in file
|
|
898
|
+
# fname = rootdir+'/'+core.ident[0:3]+ligname+args.nambsmi[0:2]
|
|
899
|
+
# if args.name:
|
|
900
|
+
# fname = rootdir+'/'+args.name+args.nambsmi[0:2]
|
|
901
|
+
# else: # else use default
|
|
902
|
+
# fname = rootdir+'/'+core.ident[0:3]+ligname+'bsm'
|
|
903
|
+
# if args.name:
|
|
904
|
+
# fname = rootdir+'/'+args.name+'bsm'
|
|
905
|
+
# else: # else use name from binding in dictionary
|
|
906
|
+
# fname = rootdir+'/'+core.ident[0:3]+ligname+bind.ident[0:2]
|
|
907
|
+
# if args.name:
|
|
908
|
+
# fname = rootdir+'/'+args.name + bind.ident[0:2]
|
|
909
|
+
# else:
|
|
910
|
+
# if globs.debug:
|
|
911
|
+
# print('the root calculation directory is' + str(rootdir))
|
|
912
|
+
# fname = rootdir+'/'+core.ident[0:3]+ligname
|
|
913
|
+
# if args.name:
|
|
914
|
+
# fname = rootdir+'/'+args.name
|
|
915
|
+
|
|
916
|
+
# return fname
|
|
917
|
+
|
|
918
|
+
# Generate complex name (this is actually used instead of namegen.py)
|
|
919
|
+
# @param rootdir Root directory
|
|
920
|
+
# @param core mol3D of core
|
|
921
|
+
# @param ligs List of ligand names
|
|
922
|
+
# @param ligoc List of ligand occurrences
|
|
923
|
+
# @param sernum Complex serial number
|
|
924
|
+
# @param args Namespace of arguments
|
|
925
|
+
# @param bind Flag for binding species (default False)
|
|
926
|
+
# @param bsmi Flag for SMILES binding species (default False)
|
|
927
|
+
# @return Complex name
|
|
928
|
+
|
|
929
|
+
|
|
930
|
+
def name_complex(rootdir: str, core, geometry, ligs, ligoc, sernum: int,
|
|
931
|
+
args, nconf=False, sanity=False, bind=False, bsmi=False) -> str:
|
|
932
|
+
# new version of the above, designed to
|
|
933
|
+
# produce more human and machine-readable formats
|
|
934
|
+
if args.name: # if set externerally
|
|
935
|
+
name = rootdir+'/'+args.name
|
|
936
|
+
else:
|
|
937
|
+
center = ''
|
|
938
|
+
if sanity:
|
|
939
|
+
center += 'badjob_'
|
|
940
|
+
try:
|
|
941
|
+
center += core.getAtom(0).symbol().lower()
|
|
942
|
+
except AttributeError:
|
|
943
|
+
if ('.xyz' in core):
|
|
944
|
+
core = core.split('.')[0]
|
|
945
|
+
center += str(core).lower()
|
|
946
|
+
name = rootdir + '/' + center
|
|
947
|
+
if args.oxstate:
|
|
948
|
+
if args.oxstate in list(romans.keys()):
|
|
949
|
+
ox = str(romans[args.oxstate])
|
|
950
|
+
else:
|
|
951
|
+
ox = str(args.oxstate)
|
|
952
|
+
else:
|
|
953
|
+
ox = "0"
|
|
954
|
+
name += "_" + str(geometry)
|
|
955
|
+
name += "_" + str(ox)
|
|
956
|
+
if args.spin:
|
|
957
|
+
spin = str(args.spin)
|
|
958
|
+
else:
|
|
959
|
+
spin = "0"
|
|
960
|
+
licores = getlicores()
|
|
961
|
+
sminum = 0
|
|
962
|
+
for i, lig in enumerate(ligs):
|
|
963
|
+
if lig not in licores: # indicative of a SMILES string, or a misspelled ligand
|
|
964
|
+
# Checking if it is likely a misspelling
|
|
965
|
+
text_similarities = [difflib.SequenceMatcher(None, lig, i).ratio() for i in list(licores.keys())]
|
|
966
|
+
if max(text_similarities) > 0.6: # likely a misspelling of a ligand that is in ligands.dict
|
|
967
|
+
max_similarity = max(text_similarities)
|
|
968
|
+
index_max = text_similarities.index(max_similarity)
|
|
969
|
+
desired_ligand = list(licores.keys())[index_max]
|
|
970
|
+
name += '_' + str(desired_ligand) + '_' + str(ligoc[i])
|
|
971
|
+
else: # SMILES string
|
|
972
|
+
lig = lig.split('\t')[0]
|
|
973
|
+
sminum += 1
|
|
974
|
+
name += '_smi' + str(int(sernum)+int(sminum)
|
|
975
|
+
) + '_' + str(ligoc[i])
|
|
976
|
+
else: # ligand is in ligands.dict
|
|
977
|
+
name += '_' + str(lig) + '_' + str(ligoc[i])
|
|
978
|
+
name += "_s_"+str(spin)
|
|
979
|
+
if args.debug:
|
|
980
|
+
print([nconf, args.nconfs])
|
|
981
|
+
if nconf and int(args.nconfs) >= 1:
|
|
982
|
+
name += "_conf_"+str(nconf)
|
|
983
|
+
if args.bind:
|
|
984
|
+
if bsmi:
|
|
985
|
+
if args.nambsmi: # if name specified use it in file
|
|
986
|
+
name += "_" + +args.nambsmi[0:2]
|
|
987
|
+
if args.antigeoisomer:
|
|
988
|
+
name += '_antigeoisomer'
|
|
989
|
+
return name
|
|
990
|
+
|
|
991
|
+
# Generate complex name (this is actually used instead of namegen.py)
|
|
992
|
+
# @param rootdir Root directory
|
|
993
|
+
# @param core mol3D of core
|
|
994
|
+
# @param ligs List of ligand names
|
|
995
|
+
# @param ligoc List of ligand occurrences
|
|
996
|
+
# @param sernum Complex serial number
|
|
997
|
+
# @param args Namespace of arguments
|
|
998
|
+
# @param bind Flag for binding species (default False)
|
|
999
|
+
# @param bsmi Flag for SMILES binding species (default False)
|
|
1000
|
+
# @return Complex name
|
|
1001
|
+
|
|
1002
|
+
|
|
1003
|
+
def name_ts_complex(rootdir, core, geometry, ligs, ligoc, substrate, subcatoms,
|
|
1004
|
+
mlig, mligcatoms, sernum, args, nconf=False, sanity=False,
|
|
1005
|
+
bind=False, bsmi=False) -> str:
|
|
1006
|
+
# new version of the above, designed to
|
|
1007
|
+
# produce more human and machine-readable formats
|
|
1008
|
+
if args.name: # if set externerally
|
|
1009
|
+
name = rootdir+'/'+args.name
|
|
1010
|
+
else:
|
|
1011
|
+
center = ''
|
|
1012
|
+
if sanity:
|
|
1013
|
+
center += 'badjob_'
|
|
1014
|
+
try:
|
|
1015
|
+
center += core.getAtom(0).symbol().lower()
|
|
1016
|
+
except AttributeError:
|
|
1017
|
+
if ('.xyz' in core):
|
|
1018
|
+
core = core.split('.')[0]
|
|
1019
|
+
center += str(core).lower()
|
|
1020
|
+
name = rootdir + '/' + center
|
|
1021
|
+
if args.oxstate:
|
|
1022
|
+
if args.oxstate in list(romans.keys()):
|
|
1023
|
+
ox = str(romans[args.oxstate])
|
|
1024
|
+
else:
|
|
1025
|
+
ox = str(args.oxstate)
|
|
1026
|
+
else:
|
|
1027
|
+
ox = "0"
|
|
1028
|
+
name += "_" + str(geometry)
|
|
1029
|
+
name += "_" + str(ox)
|
|
1030
|
+
licores = getlicores()
|
|
1031
|
+
sminum = 0
|
|
1032
|
+
for i, lig in enumerate(ligs):
|
|
1033
|
+
if lig not in licores:
|
|
1034
|
+
# unused:
|
|
1035
|
+
# lig = lig.split('\t')[0]
|
|
1036
|
+
sminum += 1
|
|
1037
|
+
name += '_smi' + str(int(sernum)+int(sminum)
|
|
1038
|
+
) + '_' + str(ligoc[i])
|
|
1039
|
+
else:
|
|
1040
|
+
name += '_' + str(lig) + '_' + str(ligoc[i])
|
|
1041
|
+
# for i,sub in enumerate(substrate):
|
|
1042
|
+
# name += "_" + str(sub)
|
|
1043
|
+
# for i,subcatom in enumerate(str(subcatoms))):
|
|
1044
|
+
# name += "_" + str(subcatom)
|
|
1045
|
+
for sub in substrate:
|
|
1046
|
+
if '.' in sub:
|
|
1047
|
+
sub = sub.split('.')[0]
|
|
1048
|
+
name += "_" + str(sub)
|
|
1049
|
+
for subcatom in subcatoms:
|
|
1050
|
+
name += "_" + str(subcatom)
|
|
1051
|
+
# for i,mlig_i in enumerate(mlig):
|
|
1052
|
+
# name += "_" + str(mlig)
|
|
1053
|
+
# for j,mligcatom in enumerate(mligcatoms):
|
|
1054
|
+
# name += "_" + str(mligcatom)
|
|
1055
|
+
if mlig:
|
|
1056
|
+
name += "_" + str(mlig[0])
|
|
1057
|
+
if mligcatoms:
|
|
1058
|
+
name += "_" + str(mligcatoms[0])
|
|
1059
|
+
if args.spin:
|
|
1060
|
+
spin = str(args.spin)
|
|
1061
|
+
else:
|
|
1062
|
+
spin = "0"
|
|
1063
|
+
name += "_s_"+str(spin)
|
|
1064
|
+
if nconf and int(args.nconfs) >= 1:
|
|
1065
|
+
name += "_conf_"+str(nconf)
|
|
1066
|
+
if args.bind:
|
|
1067
|
+
if bsmi:
|
|
1068
|
+
if args.nambsmi: # if name specified use it in file
|
|
1069
|
+
name += "_" + +args.nambsmi[0:2]
|
|
1070
|
+
return name
|
|
1071
|
+
|
|
1072
|
+
# ## Generate transition state name
|
|
1073
|
+
# # @param rootdir Root directory
|
|
1074
|
+
# # @param core mol3D of core
|
|
1075
|
+
# # @param subst mol3D of substrate
|
|
1076
|
+
# # @param args Namespace of arguments
|
|
1077
|
+
# # @param bind Flag for binding species (default False)
|
|
1078
|
+
# # @param bsmi Flag for SMILES binding species (default False)
|
|
1079
|
+
# # @return Transition state name
|
|
1080
|
+
# def name_TS(rootdir,core,subst,args,bind= False,bsmi=False):
|
|
1081
|
+
# ## new version of the above, designed to
|
|
1082
|
+
# ## produce more human and machine-readable formats
|
|
1083
|
+
# globs = globalvars()
|
|
1084
|
+
# if args.name: # if set externerally
|
|
1085
|
+
# name = rootdir+'/'+args.name
|
|
1086
|
+
# else:
|
|
1087
|
+
# try:
|
|
1088
|
+
# center = core.getAtom(0).symbol().lower()
|
|
1089
|
+
# except AttributeError:
|
|
1090
|
+
# center = str(core).lower()
|
|
1091
|
+
# name = rootdir + '/' + center
|
|
1092
|
+
# #if args.oxstate:
|
|
1093
|
+
# #if args.oxstate in romans.keys():
|
|
1094
|
+
# #ox = str(romans[args.oxstate])
|
|
1095
|
+
# #else:
|
|
1096
|
+
# #ox = str(args.oxstate)
|
|
1097
|
+
# #else:
|
|
1098
|
+
# #ox = "0"
|
|
1099
|
+
# #name += "_" + str(ox)
|
|
1100
|
+
# if args.spin:
|
|
1101
|
+
# spin = str(args.spin)
|
|
1102
|
+
# else:
|
|
1103
|
+
# spin = "0"
|
|
1104
|
+
# name += "_s_"+str(spin)
|
|
1105
|
+
# name += "_" + str(subst.ident) + "_TS"
|
|
1106
|
+
# if args.bind:
|
|
1107
|
+
# if bsmi:
|
|
1108
|
+
# if args.nambsmi: # if name specified use it in file
|
|
1109
|
+
# name += "_" + +args.nambsmi[0:2]
|
|
1110
|
+
# return name
|
|
1111
|
+
|
|
1112
|
+
# Copies ligands, binding species and cores to user-specified path
|
|
1113
|
+
|
|
1114
|
+
|
|
1115
|
+
def copy_to_custom_path():
|
|
1116
|
+
globs = globalvars()
|
|
1117
|
+
if not globs.custom_path:
|
|
1118
|
+
print('Error, custom path not set!')
|
|
1119
|
+
raise FileNotFoundError('Error, custom path not set!')
|
|
1120
|
+
# create folder
|
|
1121
|
+
if not os.path.exists(globs.custom_path):
|
|
1122
|
+
os.makedirs(globs.custom_path)
|
|
1123
|
+
# copytree cannot overwrite, need to enusre directory does not exist already
|
|
1124
|
+
core_dir = resource_files("molSimplify").joinpath("Cores")
|
|
1125
|
+
li_dir = resource_files("molSimplify").joinpath("Ligands")
|
|
1126
|
+
bind_dir = resource_files("molSimplify").joinpath("Bind")
|
|
1127
|
+
data_dir = resource_files("molSimplify").joinpath("Data")
|
|
1128
|
+
subs_dir = resource_files("molSimplify").joinpath("Substrates")
|
|
1129
|
+
if os.path.exists(str(globs.custom_path).rstrip("/")+"/Cores"):
|
|
1130
|
+
print('Note: removing old molSimplify data')
|
|
1131
|
+
shutil.rmtree(str(globs.custom_path).rstrip("/")+"/Cores")
|
|
1132
|
+
if os.path.exists(str(globs.custom_path).rstrip("/")+"/Ligands"):
|
|
1133
|
+
print('Note: removing old molSimplify data')
|
|
1134
|
+
shutil.rmtree(str(globs.custom_path).rstrip("/")+"/Ligands")
|
|
1135
|
+
if os.path.exists(str(globs.custom_path).rstrip("/")+"/Bind"):
|
|
1136
|
+
print('Note: removing old molSimplify data')
|
|
1137
|
+
shutil.rmtree(str(globs.custom_path).rstrip("/")+"/Bind")
|
|
1138
|
+
if os.path.exists(str(globs.custom_path).rstrip("/")+"/Data"):
|
|
1139
|
+
print('Note: removing old molSimplify data')
|
|
1140
|
+
shutil.rmtree(str(globs.custom_path).rstrip("/")+"/Data")
|
|
1141
|
+
if os.path.exists(str(globs.custom_path).rstrip("/")+"/Substrates"):
|
|
1142
|
+
print('Note: removing old molSimplify data')
|
|
1143
|
+
shutil.rmtree(str(globs.custom_path).rstrip("/")+"/Substrates")
|
|
1144
|
+
|
|
1145
|
+
shutil.copytree(core_dir, str(globs.custom_path).rstrip("/")+"/Cores")
|
|
1146
|
+
shutil.copytree(li_dir, str(globs.custom_path).rstrip("/")+"/Ligands")
|
|
1147
|
+
shutil.copytree(bind_dir, str(globs.custom_path).rstrip("/")+"/Bind")
|
|
1148
|
+
shutil.copytree(data_dir, str(globs.custom_path).rstrip("/")+"/Data")
|
|
1149
|
+
shutil.copytree(subs_dir, str(globs.custom_path).rstrip("/")+"/Substrates")
|