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,894 @@
|
|
|
1
|
+
# @file nn_prep.py
|
|
2
|
+
# Helper routines for ANN integration
|
|
3
|
+
#
|
|
4
|
+
# Written by JP Janet for HJK Group
|
|
5
|
+
#
|
|
6
|
+
# Dpt of Chemical Engineering, MIT
|
|
7
|
+
|
|
8
|
+
import time
|
|
9
|
+
import os
|
|
10
|
+
from typing import Tuple, List, Dict, Any, Union
|
|
11
|
+
from molSimplify.Classes.ligand import ligand
|
|
12
|
+
from molSimplify.Classes.mol3D import mol3D
|
|
13
|
+
from molSimplify.Classes.atom3D import atom3D
|
|
14
|
+
from molSimplify.Scripts.io import lig_load
|
|
15
|
+
from molSimplify.Informatics.RACassemble import (assemble_connectivity_from_parts,
|
|
16
|
+
create_OHE)
|
|
17
|
+
from molSimplify.Informatics.lacRACAssemble import get_descriptor_vector
|
|
18
|
+
from molSimplify.Informatics.decoration_manager import (decorate_ligand)
|
|
19
|
+
from molSimplify.utils.tensorflow import tensorflow_silence
|
|
20
|
+
from molSimplify.utils.timer import DebugTimer
|
|
21
|
+
from molSimplify.python_nn.clf_analysis_tool import lse_trust
|
|
22
|
+
from molSimplify.python_nn.tf_ANN import (ANN_supervisor,
|
|
23
|
+
find_ANN_10_NN_normalized_latent_dist,
|
|
24
|
+
find_ANN_latent_dist,
|
|
25
|
+
find_true_min_eu_dist)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def spin_classify(metal: str, spin: Union[int, str], ox: int) -> Tuple[bool, List[int]]:
|
|
29
|
+
metal_spin_dictionary = {'co': {2: 4, 3: 5},
|
|
30
|
+
'cr': {2: 5, 3: 4},
|
|
31
|
+
'fe': {2: 5, 3: 6},
|
|
32
|
+
'mn': {2: 6, 3: 5},
|
|
33
|
+
'ni': {2: 3}}
|
|
34
|
+
|
|
35
|
+
suggest_spin_dictionary = {'co': {2: [2, 4], 3: [1, 5]},
|
|
36
|
+
'cr': {2: [1, 5], 3: [2, 4]},
|
|
37
|
+
'fe': {2: [1, 5], 3: [2, 6]},
|
|
38
|
+
'mn': {2: [2, 6], 3: [1, 5]},
|
|
39
|
+
'ni': {2: [1, 3]}}
|
|
40
|
+
|
|
41
|
+
high_spin = False
|
|
42
|
+
if (int(spin) >= int(metal_spin_dictionary[metal][ox])):
|
|
43
|
+
high_spin = True
|
|
44
|
+
spin_ops = suggest_spin_dictionary[metal][ox]
|
|
45
|
+
return high_spin, spin_ops
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# wrapper to get ANN predictions from a known mol3D()
|
|
49
|
+
# generally unsafe
|
|
50
|
+
def invoke_ANNs_from_mol3d(mol: mol3D, oxidation_state: int,
|
|
51
|
+
alpha: float = 0.2, debug: bool = False) -> dict:
|
|
52
|
+
|
|
53
|
+
tensorflow_silence()
|
|
54
|
+
|
|
55
|
+
# check input
|
|
56
|
+
if not oxidation_state == 2 and not oxidation_state == 3:
|
|
57
|
+
print('Error, oxidation state must be 2 or 3')
|
|
58
|
+
return {}
|
|
59
|
+
|
|
60
|
+
# find the metal from RACs
|
|
61
|
+
metal = mol.getAtom(mol.findMetal()[0]).symbol()
|
|
62
|
+
# get RACs
|
|
63
|
+
descriptor_names, descriptors = get_descriptor_vector(
|
|
64
|
+
mol, ox_modifier={metal: oxidation_state})
|
|
65
|
+
# get one-hot-encoding (OHE)
|
|
66
|
+
ohe_names, ohe_values = create_OHE(metal.capitalize(), oxidation_state)
|
|
67
|
+
descriptor_names += ohe_names
|
|
68
|
+
descriptors += ohe_values
|
|
69
|
+
# set exchange fraction
|
|
70
|
+
descriptor_names += ['alpha']
|
|
71
|
+
descriptors += [alpha]
|
|
72
|
+
|
|
73
|
+
# call ANN for splitting
|
|
74
|
+
split, latent_split = ANN_supervisor(
|
|
75
|
+
'split', descriptors, descriptor_names, debug)
|
|
76
|
+
|
|
77
|
+
# call ANN for bond lengths
|
|
78
|
+
to_roman = {2: 'ii', 3: 'iii'}
|
|
79
|
+
r_ls, latent_r_ls = ANN_supervisor(
|
|
80
|
+
f'ls_{to_roman[oxidation_state]}', descriptors, descriptor_names, debug)
|
|
81
|
+
r_hs, latent_r_hs = ANN_supervisor(
|
|
82
|
+
f'hs_{to_roman[oxidation_state]}', descriptors, descriptor_names, debug)
|
|
83
|
+
|
|
84
|
+
# ANN distance for splitting
|
|
85
|
+
split_dist = find_true_min_eu_dist("split", descriptors, descriptor_names)
|
|
86
|
+
|
|
87
|
+
# compile results and return
|
|
88
|
+
results_dictionary = {"ls_bl": r_ls,
|
|
89
|
+
"hs_bl": r_hs,
|
|
90
|
+
"split": split,
|
|
91
|
+
"distance": split_dist}
|
|
92
|
+
return (results_dictionary)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def tf_check_ligands(ligs: List[str], batslist: List[List[int]],
|
|
96
|
+
dents: List[int], tcats: List[List[Union[int, str]]],
|
|
97
|
+
occs: List[int], debug: bool):
|
|
98
|
+
# tests if ligand combination
|
|
99
|
+
# is compatible with the ANN
|
|
100
|
+
# INPUT:
|
|
101
|
+
# - ligs: list of mol3D class, ligands
|
|
102
|
+
# - batslist: list of int, occupations
|
|
103
|
+
# - dents: list of int, denticity
|
|
104
|
+
# - tcats: list of int/bool
|
|
105
|
+
# OUTPUT:
|
|
106
|
+
# - valid: bool
|
|
107
|
+
# tcats controls
|
|
108
|
+
# manual override
|
|
109
|
+
# of connection atoms
|
|
110
|
+
|
|
111
|
+
n_ligs = len(ligs)
|
|
112
|
+
if debug:
|
|
113
|
+
print(('nligs ' + str(n_ligs)))
|
|
114
|
+
print(('ligs ' + str(ligs)))
|
|
115
|
+
print(('occs in function ' + str(occs)))
|
|
116
|
+
print(('tcats in function ' + str(tcats)))
|
|
117
|
+
|
|
118
|
+
axial_ind_list = []
|
|
119
|
+
equatorial_ind_list = []
|
|
120
|
+
axial_ligs = []
|
|
121
|
+
equatorial_ligs = []
|
|
122
|
+
ax_dent = 0
|
|
123
|
+
eq_dent = 0
|
|
124
|
+
eq_tcat = []
|
|
125
|
+
ax_tcat = []
|
|
126
|
+
pentadentate = False
|
|
127
|
+
ax_occs = []
|
|
128
|
+
eq_occs = []
|
|
129
|
+
valid = True
|
|
130
|
+
if (set(dents) == set([2])):
|
|
131
|
+
print('triple bidentate case')
|
|
132
|
+
unique_ligs = []
|
|
133
|
+
ucats = []
|
|
134
|
+
unique_dict = {}
|
|
135
|
+
if not (n_ligs) == 3:
|
|
136
|
+
# something unexpected happened!
|
|
137
|
+
valid = False
|
|
138
|
+
for i in range(0, n_ligs):
|
|
139
|
+
this_lig = ligs[i]
|
|
140
|
+
# mulitple points
|
|
141
|
+
if not (this_lig in unique_ligs):
|
|
142
|
+
unique_ligs.append(this_lig)
|
|
143
|
+
ucats.append(tcats[i])
|
|
144
|
+
unique_dict.update({this_lig: 1})
|
|
145
|
+
elif (this_lig in unique_ligs):
|
|
146
|
+
unique_dict.update({this_lig: unique_dict[this_lig] + 1})
|
|
147
|
+
|
|
148
|
+
if len(unique_ligs) == 1:
|
|
149
|
+
axial_ligs.append(ligs[0])
|
|
150
|
+
ax_dent = 2
|
|
151
|
+
ax_tcat = tcats[0]
|
|
152
|
+
ax_occs.append(1)
|
|
153
|
+
equatorial_ligs.append(ligs[0])
|
|
154
|
+
eq_dent = 2
|
|
155
|
+
eq_tcat = tcats[0]
|
|
156
|
+
eq_occs.append(2)
|
|
157
|
+
elif len(unique_ligs) == 2:
|
|
158
|
+
for key in list(unique_dict.keys()):
|
|
159
|
+
if unique_dict[key] == 1:
|
|
160
|
+
axial_ligs.append(key)
|
|
161
|
+
ax_dent = 2
|
|
162
|
+
ax_occs.append(1)
|
|
163
|
+
ax_tcat = tcats[ligs.index(key)]
|
|
164
|
+
elif unique_dict[key] == 2:
|
|
165
|
+
equatorial_ligs.append(key)
|
|
166
|
+
eq_dent = 2
|
|
167
|
+
eq_occs.append(2)
|
|
168
|
+
eq_tcat = tcats[ligs.index(key)]
|
|
169
|
+
else:
|
|
170
|
+
valid = False
|
|
171
|
+
elif (set(dents) == set([1, 5])):
|
|
172
|
+
print('THIS IS A PENTADENTATE!')
|
|
173
|
+
pentadentate = True
|
|
174
|
+
for i in range(0, n_ligs):
|
|
175
|
+
this_bat = batslist[i]
|
|
176
|
+
this_lig = ligs[i]
|
|
177
|
+
this_dent = dents[i]
|
|
178
|
+
this_occ = occs[i]
|
|
179
|
+
if debug:
|
|
180
|
+
print('\n')
|
|
181
|
+
print(('iteration ' + str(i)))
|
|
182
|
+
print(('this_lig ' + str(this_lig)))
|
|
183
|
+
print(('this_dent ' + str(this_dent)))
|
|
184
|
+
print(('this_occ ' + str(this_occ)))
|
|
185
|
+
print(('this backbone atom ' +
|
|
186
|
+
str(this_bat) + ' from ' + str(batslist)))
|
|
187
|
+
# mulitple points
|
|
188
|
+
if len(this_bat) > 1:
|
|
189
|
+
if debug:
|
|
190
|
+
print(('adding ' + str(this_lig) + ' to equatorial'))
|
|
191
|
+
equatorial_ligs.append(this_lig)
|
|
192
|
+
eq_dent = 4
|
|
193
|
+
eq_tcat = tcats[i]
|
|
194
|
+
eq_occs.append(1)
|
|
195
|
+
equatorial_ind_list.append(i)
|
|
196
|
+
if debug:
|
|
197
|
+
print(('adding ' + str(this_lig) + ' to axial'))
|
|
198
|
+
axial_ligs.append(this_lig)
|
|
199
|
+
ax_dent = 1
|
|
200
|
+
ax_tcat = tcats[i]
|
|
201
|
+
ax_occs.append(1)
|
|
202
|
+
axial_ind_list.append(i)
|
|
203
|
+
|
|
204
|
+
else:
|
|
205
|
+
for i in range(0, n_ligs):
|
|
206
|
+
this_bat = batslist[i]
|
|
207
|
+
this_lig = ligs[i]
|
|
208
|
+
this_dent = dents[i]
|
|
209
|
+
this_occ = occs[i]
|
|
210
|
+
if debug:
|
|
211
|
+
print('\n')
|
|
212
|
+
print(('iteration ' + str(i)))
|
|
213
|
+
print(('this_lig ' + str(this_lig)))
|
|
214
|
+
print(('this_dent ' + str(this_dent)))
|
|
215
|
+
print(('this_occ ' + str(this_occ)))
|
|
216
|
+
print(('this backbone atom ' +
|
|
217
|
+
str(this_bat) + ' from ' + str(batslist)))
|
|
218
|
+
# mulitple points
|
|
219
|
+
if len(this_bat) == 1:
|
|
220
|
+
if (5 in this_bat) or (6 in this_bat):
|
|
221
|
+
if debug:
|
|
222
|
+
print(('adding ' + str(this_lig) + ' to axial'))
|
|
223
|
+
axial_ligs.append(this_lig)
|
|
224
|
+
ax_dent = this_dent
|
|
225
|
+
if this_lig not in ['x', 'oxo', 'hydroxyl']:
|
|
226
|
+
ax_tcat = tcats[i]
|
|
227
|
+
ax_occs.append(occs[i])
|
|
228
|
+
axial_ind_list.append(i)
|
|
229
|
+
else:
|
|
230
|
+
if debug:
|
|
231
|
+
print(('adding ' + str(this_lig) + ' to equatorial'))
|
|
232
|
+
equatorial_ligs.append(this_lig)
|
|
233
|
+
eq_dent = this_dent
|
|
234
|
+
eq_tcat = tcats[i]
|
|
235
|
+
eq_occs.append(occs[i])
|
|
236
|
+
equatorial_ind_list.append(i)
|
|
237
|
+
else:
|
|
238
|
+
equatorial_ligs.append(this_lig)
|
|
239
|
+
eq_dent = this_dent
|
|
240
|
+
eq_tcat = tcats[i]
|
|
241
|
+
eq_occs.append(occs[i])
|
|
242
|
+
equatorial_ind_list.append(i)
|
|
243
|
+
if (len(axial_ligs) > 2):
|
|
244
|
+
print('ANN setup error: axial lig error : ',
|
|
245
|
+
axial_ligs, ax_dent, ax_tcat, ax_occs)
|
|
246
|
+
valid = False
|
|
247
|
+
if debug:
|
|
248
|
+
print(('eq occupations ' + str(eq_occs)))
|
|
249
|
+
print(('eq dent ' + str(eq_dent)))
|
|
250
|
+
if not (4.0 / (float(eq_dent) * sum(eq_occs)) == 1):
|
|
251
|
+
print('ANN setup error: equatorial ligs error: ',
|
|
252
|
+
equatorial_ligs, eq_dent, eq_tcat)
|
|
253
|
+
valid = False
|
|
254
|
+
if valid and len(axial_ind_list) == 0: # get the index position in ligs
|
|
255
|
+
axial_ind_list = [ligs.index(ax_lig) for ax_lig in axial_ligs]
|
|
256
|
+
if valid and len(equatorial_ind_list) == 0: # get the index position in ligs
|
|
257
|
+
equatorial_ind_list = [ligs.index(eq_lig)
|
|
258
|
+
for eq_lig in equatorial_ligs]
|
|
259
|
+
|
|
260
|
+
return (valid, axial_ligs, equatorial_ligs, ax_dent, eq_dent, ax_tcat, eq_tcat,
|
|
261
|
+
axial_ind_list, equatorial_ind_list, ax_occs, eq_occs, pentadentate)
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def check_metal(metal: str, oxidation_state: str) -> Tuple[bool, str]:
|
|
265
|
+
supported_metal_dict = {"fe": [2, 3], "mn": [2, 3], "cr": [2, 3],
|
|
266
|
+
"co": [2, 3], "ni": [2]}
|
|
267
|
+
romans = {'I': '1', 'II': '2', 'III': '3', 'IV': '4', 'V': '5', 'VI': '6'}
|
|
268
|
+
if oxidation_state in list(romans.keys()):
|
|
269
|
+
oxidation_state = romans[oxidation_state]
|
|
270
|
+
outcome = False
|
|
271
|
+
if metal in list(supported_metal_dict):
|
|
272
|
+
# print('metal in',supported_metal_dict[metal])
|
|
273
|
+
if int(oxidation_state) in supported_metal_dict[metal]:
|
|
274
|
+
outcome = True
|
|
275
|
+
return outcome, oxidation_state
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def tf_ANN_preproc(metal: str, oxstate, spin, ligs: List[str], occs: List[int], dents: List[int],
|
|
279
|
+
batslist: List[List[int]], tcats: List[List[Union[int, str]]],
|
|
280
|
+
licores: dict, decoration, decoration_index, exchange, geometry: str = "oct",
|
|
281
|
+
debug: bool = False) -> Tuple[bool, str, dict, bool]:
|
|
282
|
+
# prepares and runs ANN calculation
|
|
283
|
+
|
|
284
|
+
start_time = time.perf_counter()
|
|
285
|
+
|
|
286
|
+
######################
|
|
287
|
+
ANN_reason = 'None'
|
|
288
|
+
ANN_attributes: Dict[str, Any] = {}
|
|
289
|
+
######################
|
|
290
|
+
|
|
291
|
+
emsg = list()
|
|
292
|
+
valid = True
|
|
293
|
+
catalysis = False
|
|
294
|
+
# Set default oxidation state variables
|
|
295
|
+
ox = 0
|
|
296
|
+
this_metal = metal.lower()
|
|
297
|
+
if len(this_metal) > 2:
|
|
298
|
+
this_metal = this_metal[0:2]
|
|
299
|
+
newligs = []
|
|
300
|
+
newcats = []
|
|
301
|
+
newdents = []
|
|
302
|
+
newoccs = []
|
|
303
|
+
newdecs = [False] * 6
|
|
304
|
+
newdec_inds = [[0]] * 6
|
|
305
|
+
count = -1
|
|
306
|
+
for i, lig in enumerate(ligs):
|
|
307
|
+
this_occ = occs[i]
|
|
308
|
+
if debug:
|
|
309
|
+
print(('working on lig: ' + str(lig)))
|
|
310
|
+
print(('occ is ' + str(this_occ)))
|
|
311
|
+
for j in range(0, int(this_occ)):
|
|
312
|
+
count += 1
|
|
313
|
+
newligs.append(lig)
|
|
314
|
+
newdents.append(dents[i])
|
|
315
|
+
newcats.append(tcats[i])
|
|
316
|
+
newoccs.append(1)
|
|
317
|
+
if decoration:
|
|
318
|
+
newdecs[count] = (decoration[i])
|
|
319
|
+
newdec_inds[count] = (decoration_index[i])
|
|
320
|
+
|
|
321
|
+
ligs = newligs
|
|
322
|
+
dents = newdents
|
|
323
|
+
tcats = newcats
|
|
324
|
+
occs = newoccs
|
|
325
|
+
if debug:
|
|
326
|
+
print('tf_nn has finished prepping ligands')
|
|
327
|
+
|
|
328
|
+
if not geometry == "oct":
|
|
329
|
+
emsg.append(
|
|
330
|
+
"[ANN] Geometry is not supported at this time, MUST give -geometry = oct if you want an ANN prediction.")
|
|
331
|
+
valid = False
|
|
332
|
+
ANN_reason = 'geometry not octahedral'
|
|
333
|
+
return valid, ANN_reason, ANN_attributes, catalysis
|
|
334
|
+
if not oxstate:
|
|
335
|
+
emsg.append("\n oxidation state must be given for an ANN prediction.")
|
|
336
|
+
valid = False
|
|
337
|
+
ANN_reason = 'oxstate not given'
|
|
338
|
+
return valid, ANN_reason, ANN_attributes, catalysis
|
|
339
|
+
if valid:
|
|
340
|
+
oxidation_state = oxstate
|
|
341
|
+
valid, oxidation_state = check_metal(this_metal, oxidation_state)
|
|
342
|
+
if debug:
|
|
343
|
+
print(f'valid after running check_metal? {valid}')
|
|
344
|
+
if int(oxidation_state) in [3, 4, 5]:
|
|
345
|
+
catalytic_moieties = ['oxo', 'x', 'hydroxyl', '[O--]', '[OH-]']
|
|
346
|
+
if debug:
|
|
347
|
+
print(('the ligands are', ligs))
|
|
348
|
+
print((set(ligs).intersection(set(catalytic_moieties))))
|
|
349
|
+
if len(set(ligs).intersection(set(catalytic_moieties))) > 0:
|
|
350
|
+
catalysis = True
|
|
351
|
+
# generate key in descriptor space
|
|
352
|
+
ox = int(oxidation_state)
|
|
353
|
+
if debug:
|
|
354
|
+
print(('metal is ' + str(this_metal)))
|
|
355
|
+
print(('metal validity', valid))
|
|
356
|
+
if not valid and not catalysis:
|
|
357
|
+
emsg.append("\n The only metals that are supported are Fe, Mn, Cr, Co, and Ni")
|
|
358
|
+
emsg.append("\n Oxidation state not available for this metal")
|
|
359
|
+
ANN_reason = 'metal / oxidation state combination not available'
|
|
360
|
+
return valid, ANN_reason, ANN_attributes, catalysis
|
|
361
|
+
if valid:
|
|
362
|
+
try:
|
|
363
|
+
spin_classify(this_metal, spin, ox)
|
|
364
|
+
except KeyError:
|
|
365
|
+
valid = False
|
|
366
|
+
|
|
367
|
+
if emsg:
|
|
368
|
+
print((str(" ".join(["ANN messages:"] + [str(i) for i in emsg]))))
|
|
369
|
+
|
|
370
|
+
if not valid and not catalysis:
|
|
371
|
+
emsg.append("\n this spin state not available for this metal")
|
|
372
|
+
ANN_reason = 'spin state not available for metal'
|
|
373
|
+
return valid, ANN_reason, ANN_attributes, catalysis
|
|
374
|
+
# Else, i.e. valid or catalysis
|
|
375
|
+
(valid, axial_ligs, equatorial_ligs, ax_dent, eq_dent, ax_tcat, eq_tcat, axial_ind_list,
|
|
376
|
+
equatorial_ind_list, ax_occs, eq_occs, pentadentate) = tf_check_ligands(
|
|
377
|
+
ligs, batslist, dents, tcats, occs, debug)
|
|
378
|
+
|
|
379
|
+
if debug:
|
|
380
|
+
print(("ligand validity is " + str(valid)))
|
|
381
|
+
print(('Occs', occs))
|
|
382
|
+
print(('Ligands', ligs))
|
|
383
|
+
print(('Dents', dents))
|
|
384
|
+
print(('Bats (backbone atoms)', batslist))
|
|
385
|
+
print(('lig validity', valid))
|
|
386
|
+
print(('ax ligs', axial_ligs))
|
|
387
|
+
print(('eq ligs', equatorial_ligs))
|
|
388
|
+
print(('spin is', spin))
|
|
389
|
+
|
|
390
|
+
if catalysis:
|
|
391
|
+
valid = False
|
|
392
|
+
if debug:
|
|
393
|
+
print('tf_nn detects catalytic')
|
|
394
|
+
ANN_reason = 'catalytic structure presented'
|
|
395
|
+
|
|
396
|
+
net_lig_charge = 0
|
|
397
|
+
if not valid and not catalysis:
|
|
398
|
+
ANN_reason = 'found incorrect ligand symmetry'
|
|
399
|
+
# or, an invalid metal, oxidation state, spin state combination was used
|
|
400
|
+
return valid, ANN_reason, ANN_attributes, catalysis
|
|
401
|
+
# Else, i.e. valid or catalysis
|
|
402
|
+
ax_ligands_list = list()
|
|
403
|
+
eq_ligands_list = list()
|
|
404
|
+
if debug:
|
|
405
|
+
print('loading axial ligands')
|
|
406
|
+
for ii, axl in enumerate(axial_ligs):
|
|
407
|
+
ax_lig3D, r_emsg = lig_load(axl, licores) # load ligand
|
|
408
|
+
net_lig_charge += ax_lig3D.charge
|
|
409
|
+
if r_emsg:
|
|
410
|
+
emsg += r_emsg
|
|
411
|
+
if ax_tcat:
|
|
412
|
+
ax_lig3D.cat = ax_tcat
|
|
413
|
+
if debug:
|
|
414
|
+
print(('custom ax connect atom given (0-ind) ' + str(ax_tcat)))
|
|
415
|
+
if pentadentate and len(ax_lig3D.cat) > 1:
|
|
416
|
+
ax_lig3D.cat = [ax_lig3D.cat[-1]]
|
|
417
|
+
this_lig = ligand(mol3D(), [], ax_dent)
|
|
418
|
+
this_lig.mol = ax_lig3D
|
|
419
|
+
|
|
420
|
+
# check decoration index
|
|
421
|
+
if newdecs:
|
|
422
|
+
if newdecs[axial_ind_list[ii]]:
|
|
423
|
+
print(('decorating ' + str(axl) + ' with ' + str(newdecs[axial_ind_list[ii]]) + ' at sites ' + str(
|
|
424
|
+
newdec_inds[axial_ind_list[ii]])))
|
|
425
|
+
ax_lig3D = decorate_ligand(
|
|
426
|
+
axl, newdecs[axial_ind_list[ii]], newdec_inds[axial_ind_list[ii]], debug)
|
|
427
|
+
ax_lig3D.convert2mol3D() # mol3D representation of ligand
|
|
428
|
+
for jj in range(0, ax_occs[ii]):
|
|
429
|
+
ax_ligands_list.append(this_lig)
|
|
430
|
+
if debug:
|
|
431
|
+
print(f'Obtained the net ligand charge, which is... {net_lig_charge}')
|
|
432
|
+
print('ax_ligands_list:')
|
|
433
|
+
print(ax_ligands_list)
|
|
434
|
+
print([h.mol.cat for h in ax_ligands_list])
|
|
435
|
+
|
|
436
|
+
if debug:
|
|
437
|
+
print(('loading equatorial ligands ' + str(equatorial_ligs)))
|
|
438
|
+
for ii, eql in enumerate(equatorial_ligs):
|
|
439
|
+
eq_lig3D, r_emsg = lig_load(eql, licores) # load ligand
|
|
440
|
+
net_lig_charge += eq_lig3D.charge
|
|
441
|
+
if r_emsg:
|
|
442
|
+
emsg += r_emsg
|
|
443
|
+
if eq_tcat:
|
|
444
|
+
eq_lig3D.cat = eq_tcat
|
|
445
|
+
if debug:
|
|
446
|
+
print(('custom eq connect atom given (0-ind) ' + str(eq_tcat)))
|
|
447
|
+
if pentadentate and len(eq_lig3D.cat) > 1:
|
|
448
|
+
eq_lig3D.cat = eq_lig3D.cat[0:4]
|
|
449
|
+
|
|
450
|
+
if newdecs:
|
|
451
|
+
if debug:
|
|
452
|
+
print(('newdecs' + str(newdecs)))
|
|
453
|
+
print(('equatorial_ind_list is ' + str(equatorial_ind_list)))
|
|
454
|
+
c = 0
|
|
455
|
+
if newdecs[equatorial_ind_list[ii]]:
|
|
456
|
+
if debug:
|
|
457
|
+
print(('decorating ' + str(eql) + ' with ' + str(
|
|
458
|
+
newdecs[equatorial_ind_list[ii]]) + ' at sites ' + str(newdec_inds[equatorial_ind_list[ii]])))
|
|
459
|
+
eq_lig3D = decorate_ligand(eql, newdecs[equatorial_ind_list[ii]],
|
|
460
|
+
newdec_inds[equatorial_ind_list[ii]], debug)
|
|
461
|
+
c += 1
|
|
462
|
+
|
|
463
|
+
eq_lig3D.convert2mol3D() # mol3D representation of ligand
|
|
464
|
+
this_lig = ligand(mol3D(), [], eq_dent)
|
|
465
|
+
this_lig.mol = eq_lig3D
|
|
466
|
+
|
|
467
|
+
for jj in range(0, eq_occs[ii]):
|
|
468
|
+
eq_ligands_list.append(this_lig)
|
|
469
|
+
if debug:
|
|
470
|
+
print('eq_ligands_list:')
|
|
471
|
+
print(eq_ligands_list)
|
|
472
|
+
print(
|
|
473
|
+
('writing copies of ligands as used in ANN to currrent dir : ' + os.getcwd()))
|
|
474
|
+
for kk, l in enumerate(ax_ligands_list):
|
|
475
|
+
l.mol.writexyz('axlig-' + str(kk) + '.xyz')
|
|
476
|
+
for kk, l in enumerate(eq_ligands_list):
|
|
477
|
+
l.mol.writexyz('eqlig-' + str(kk) + '.xyz')
|
|
478
|
+
# make description of complex
|
|
479
|
+
custom_ligand_dict = {"eq_ligand_list": eq_ligands_list,
|
|
480
|
+
"ax_ligand_list": ax_ligands_list,
|
|
481
|
+
"eq_con_int_list": [h.mol.cat for h in eq_ligands_list],
|
|
482
|
+
"ax_con_int_list": [h.mol.cat for h in ax_ligands_list]}
|
|
483
|
+
|
|
484
|
+
# placeholder for metal
|
|
485
|
+
metal_mol = mol3D()
|
|
486
|
+
metal_mol.addAtom(atom3D(metal))
|
|
487
|
+
this_complex = assemble_connectivity_from_parts(
|
|
488
|
+
metal_mol, custom_ligand_dict)
|
|
489
|
+
|
|
490
|
+
if debug:
|
|
491
|
+
print('custom_ligand_dict is : ')
|
|
492
|
+
print(custom_ligand_dict)
|
|
493
|
+
|
|
494
|
+
if debug:
|
|
495
|
+
print(('finished checking ligands, valid is ' + str(valid)))
|
|
496
|
+
print('assembling RAC custom ligand configuration dictionary')
|
|
497
|
+
|
|
498
|
+
if valid:
|
|
499
|
+
ANN_attributes = evaluate_tmc_anns(this_complex, this_metal, ox, spin,
|
|
500
|
+
custom_ligand_dict, net_lig_charge,
|
|
501
|
+
exchange, ligs, equatorial_ind_list,
|
|
502
|
+
eq_occs, axial_ind_list, ax_occs,
|
|
503
|
+
debug=debug)
|
|
504
|
+
total_ANN_time = time.perf_counter() - start_time
|
|
505
|
+
print(f'Total ML functions took {total_ANN_time:.2f} seconds')
|
|
506
|
+
|
|
507
|
+
if catalysis:
|
|
508
|
+
print('-----In Catalysis Mode-----')
|
|
509
|
+
ANN_attributes = evaluate_catalytic_anns(this_complex, this_metal, ox, spin,
|
|
510
|
+
custom_ligand_dict, net_lig_charge,
|
|
511
|
+
exchange, debug=debug)
|
|
512
|
+
total_ANN_time = time.perf_counter() - start_time
|
|
513
|
+
print(f'Total Catalysis ML functions took {total_ANN_time:.2f} seconds')
|
|
514
|
+
|
|
515
|
+
if not valid and not ANN_reason and not catalysis:
|
|
516
|
+
ANN_reason = ' uncaught rejection (see sdout/stderr)'
|
|
517
|
+
|
|
518
|
+
return valid, ANN_reason, ANN_attributes, catalysis
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
def evaluate_tmc_anns(this_complex: mol3D, metal: str, ox: int, spin: int,
|
|
522
|
+
custom_ligand_dict: Dict[str, list],
|
|
523
|
+
net_lig_charge: int, exchange: Union[str, float, int],
|
|
524
|
+
ligs, equatorial_ind_list, eq_occs, axial_ind_list, ax_occs,
|
|
525
|
+
debug: bool = False) -> Dict[str, Any]:
|
|
526
|
+
ANN_attributes: Dict[str, Any] = {}
|
|
527
|
+
high_spin, spin_ops = spin_classify(metal, spin, ox)
|
|
528
|
+
# =====Classifiers:=====
|
|
529
|
+
_descriptor_names = ["oxstate", "spinmult", "charge_lig"]
|
|
530
|
+
_descriptors = [ox, spin, net_lig_charge]
|
|
531
|
+
descriptor_names, descriptors = get_descriptor_vector(
|
|
532
|
+
this_complex, custom_ligand_dict, ox_modifier={metal: ox})
|
|
533
|
+
descriptor_names = _descriptor_names + descriptor_names
|
|
534
|
+
descriptors = _descriptors + descriptors
|
|
535
|
+
flag_oct, geo_lse = ANN_supervisor(
|
|
536
|
+
"geo_static_clf", descriptors, descriptor_names, debug=debug)
|
|
537
|
+
# Test for scikit-learn models
|
|
538
|
+
# flag_oct, geo_lse = sklearn_supervisor("geo_static_clf", descriptors, descriptor_names, debug=False)
|
|
539
|
+
sc_pred, sc_lse = ANN_supervisor(
|
|
540
|
+
"sc_static_clf", descriptors, descriptor_names, debug=debug)
|
|
541
|
+
ANN_attributes.update({"geo_label": 0 if flag_oct[0, 0] <= 0.5 else 1,
|
|
542
|
+
"geo_prob": flag_oct[0, 0],
|
|
543
|
+
"geo_LSE": geo_lse[0],
|
|
544
|
+
"geo_label_trust": lse_trust(geo_lse),
|
|
545
|
+
"sc_label": 0 if sc_pred[0, 0] <= 0.5 else 1,
|
|
546
|
+
"sc_prob": sc_pred[0, 0],
|
|
547
|
+
"sc_LSE": sc_lse[0],
|
|
548
|
+
"sc_label_trust": lse_trust(sc_lse)})
|
|
549
|
+
|
|
550
|
+
# build RACs without geo
|
|
551
|
+
with DebugTimer('getting RACs', debug):
|
|
552
|
+
descriptor_names, descriptors = get_descriptor_vector(
|
|
553
|
+
this_complex, custom_ligand_dict, ox_modifier={metal: ox})
|
|
554
|
+
|
|
555
|
+
# get one-hot-encoding (OHE)
|
|
556
|
+
ohe_names, ohe_values = create_OHE(metal.capitalize(), ox)
|
|
557
|
+
descriptor_names += ohe_names
|
|
558
|
+
descriptors += ohe_values
|
|
559
|
+
|
|
560
|
+
# get alpha
|
|
561
|
+
alpha = 0.2 # default for B3LYP
|
|
562
|
+
if exchange:
|
|
563
|
+
try:
|
|
564
|
+
if float(exchange) > 1:
|
|
565
|
+
alpha = float(exchange) / 100 # if given as %
|
|
566
|
+
elif float(exchange) <= 1:
|
|
567
|
+
alpha = float(exchange)
|
|
568
|
+
except ValueError:
|
|
569
|
+
print('cannot cast exchange argument as a float, using 20%')
|
|
570
|
+
descriptor_names += ['alpha']
|
|
571
|
+
descriptors += [alpha]
|
|
572
|
+
descriptor_names += ['ox']
|
|
573
|
+
descriptors += [ox]
|
|
574
|
+
descriptor_names += ['spin']
|
|
575
|
+
descriptors += [spin]
|
|
576
|
+
|
|
577
|
+
# get spin splitting:
|
|
578
|
+
with DebugTimer('split ANN', debug):
|
|
579
|
+
split, latent_split = ANN_supervisor(
|
|
580
|
+
'split', descriptors, descriptor_names, debug)
|
|
581
|
+
|
|
582
|
+
# get bond lengths:
|
|
583
|
+
with DebugTimer('GEO ANN', debug):
|
|
584
|
+
if ox == 2:
|
|
585
|
+
r_ls, latent_r_ls = ANN_supervisor(
|
|
586
|
+
'ls_ii', descriptors, descriptor_names, debug)
|
|
587
|
+
r_hs, latent_r_hs = ANN_supervisor(
|
|
588
|
+
'hs_ii', descriptors, descriptor_names, debug)
|
|
589
|
+
elif ox == 3:
|
|
590
|
+
r_ls, latent_r_ls = ANN_supervisor(
|
|
591
|
+
'ls_iii', descriptors, descriptor_names, debug)
|
|
592
|
+
r_hs, latent_r_hs = ANN_supervisor(
|
|
593
|
+
'hs_iii', descriptors, descriptor_names, debug)
|
|
594
|
+
else:
|
|
595
|
+
raise ValueError(f'Oxidation state {ox} not available')
|
|
596
|
+
if high_spin:
|
|
597
|
+
r = r_hs[0]
|
|
598
|
+
else:
|
|
599
|
+
r = r_ls[0]
|
|
600
|
+
|
|
601
|
+
with DebugTimer('homo ANN', debug):
|
|
602
|
+
homo, latent_homo = ANN_supervisor(
|
|
603
|
+
'homo', descriptors, descriptor_names, debug)
|
|
604
|
+
|
|
605
|
+
with DebugTimer('gap ANN', debug):
|
|
606
|
+
gap, latent_gap = ANN_supervisor(
|
|
607
|
+
'gap', descriptors, descriptor_names, debug)
|
|
608
|
+
|
|
609
|
+
# get minimum distance to train (for splitting)
|
|
610
|
+
with DebugTimer('min dist', debug):
|
|
611
|
+
split_dist = find_true_min_eu_dist(
|
|
612
|
+
"split", descriptors, descriptor_names)
|
|
613
|
+
|
|
614
|
+
with DebugTimer('min HOMO dist', debug):
|
|
615
|
+
homo_dist = find_true_min_eu_dist(
|
|
616
|
+
"homo", descriptors, descriptor_names)
|
|
617
|
+
homo_dist = find_ANN_latent_dist("homo", latent_homo, debug)
|
|
618
|
+
|
|
619
|
+
with DebugTimer('min GAP dist', debug):
|
|
620
|
+
gap_dist = find_true_min_eu_dist("gap", descriptors, descriptor_names)
|
|
621
|
+
gap_dist = find_ANN_latent_dist("gap", latent_gap, debug)
|
|
622
|
+
|
|
623
|
+
# save attributes for return
|
|
624
|
+
ANN_attributes.update({'split': split[0][0]})
|
|
625
|
+
ANN_attributes.update({'split_dist': split_dist})
|
|
626
|
+
ANN_attributes.update({'This spin': spin})
|
|
627
|
+
if split[0][0] < 0 and (abs(split[0]) > 5):
|
|
628
|
+
ANN_attributes.update({'ANN_ground_state': spin_ops[1]})
|
|
629
|
+
elif split[0][0] > 0 and (abs(split[0]) > 5):
|
|
630
|
+
ANN_attributes.update({'ANN_ground_state': spin_ops[0]})
|
|
631
|
+
else:
|
|
632
|
+
ANN_attributes.update(
|
|
633
|
+
{'ANN_ground_state': 'dgen ' + str(spin_ops)})
|
|
634
|
+
|
|
635
|
+
ANN_attributes.update({'homo': homo[0][0]})
|
|
636
|
+
ANN_attributes.update({'gap': gap[0][0]})
|
|
637
|
+
ANN_attributes.update({'homo_dist': homo_dist})
|
|
638
|
+
ANN_attributes.update({'gap_dist': gap_dist})
|
|
639
|
+
|
|
640
|
+
# now that we have bond predictions, we need to map these
|
|
641
|
+
# back to a length of equal size as the original ligand request
|
|
642
|
+
# in order for molSimplify to understand it
|
|
643
|
+
ANN_bondl = len(ligs) * [0.]
|
|
644
|
+
added = 0
|
|
645
|
+
for ii, eql in enumerate(equatorial_ind_list):
|
|
646
|
+
for jj in range(0, eq_occs[ii]):
|
|
647
|
+
ANN_bondl[added] = r[2]
|
|
648
|
+
added += 1
|
|
649
|
+
|
|
650
|
+
for ii, axl in enumerate(axial_ind_list):
|
|
651
|
+
if debug:
|
|
652
|
+
print((ii, axl, added, ax_occs))
|
|
653
|
+
for jj in range(0, ax_occs[ii]):
|
|
654
|
+
if debug:
|
|
655
|
+
print((jj, axl, added, r[ii]))
|
|
656
|
+
ANN_bondl[added] = r[ii]
|
|
657
|
+
added += 1
|
|
658
|
+
|
|
659
|
+
ANN_attributes.update({'ANN_bondl': 4 * [r[2]] + [r[0], r[1]]})
|
|
660
|
+
|
|
661
|
+
HOMO_ANN_trust = 'not set'
|
|
662
|
+
HOMO_ANN_trust_message = ""
|
|
663
|
+
# Not quite sure if this should be divided by 3 or not, since RAC-155 descriptors
|
|
664
|
+
if float(homo_dist) < 3:
|
|
665
|
+
HOMO_ANN_trust_message = 'ANN results should be trustworthy for this complex '
|
|
666
|
+
HOMO_ANN_trust = 'high'
|
|
667
|
+
elif float(homo_dist) < 5:
|
|
668
|
+
HOMO_ANN_trust_message = 'ANN results are probably useful for this complex '
|
|
669
|
+
HOMO_ANN_trust = 'medium'
|
|
670
|
+
elif float(homo_dist) <= 10:
|
|
671
|
+
HOMO_ANN_trust_message = 'ANN results are fairly far from training data, be cautious '
|
|
672
|
+
HOMO_ANN_trust = 'low'
|
|
673
|
+
elif float(homo_dist) > 10:
|
|
674
|
+
HOMO_ANN_trust_message = 'ANN results are too far from training data, be cautious '
|
|
675
|
+
HOMO_ANN_trust = 'very low'
|
|
676
|
+
ANN_attributes.update({'homo_trust': HOMO_ANN_trust})
|
|
677
|
+
ANN_attributes.update({'gap_trust': HOMO_ANN_trust})
|
|
678
|
+
|
|
679
|
+
ANN_trust = 'not set'
|
|
680
|
+
ANN_trust_message = ""
|
|
681
|
+
if float(split_dist / 3) < 0.25:
|
|
682
|
+
ANN_trust_message = 'ANN results should be trustworthy for this complex '
|
|
683
|
+
ANN_trust = 'high'
|
|
684
|
+
elif float(split_dist / 3) < 0.75:
|
|
685
|
+
ANN_trust_message = 'ANN results are probably useful for this complex '
|
|
686
|
+
ANN_trust = 'medium'
|
|
687
|
+
elif float(split_dist / 3) < 1.0:
|
|
688
|
+
ANN_trust_message = 'ANN results are fairly far from training data, be cautious '
|
|
689
|
+
ANN_trust = 'low'
|
|
690
|
+
elif float(split_dist / 3) > 1.0:
|
|
691
|
+
ANN_trust_message = 'ANN results are too far from training data, be cautious '
|
|
692
|
+
ANN_trust = 'very low'
|
|
693
|
+
ANN_attributes.update({'split_trust': ANN_trust})
|
|
694
|
+
|
|
695
|
+
# print text to std out
|
|
696
|
+
print("******************************************************************")
|
|
697
|
+
print("************** ANN is engaged and advising on spin ***************")
|
|
698
|
+
print("************** and metal-ligand bond distances ****************")
|
|
699
|
+
print("******************************************************************")
|
|
700
|
+
if high_spin:
|
|
701
|
+
print(f'You have selected a high-spin state, multiplicity = {spin}')
|
|
702
|
+
else:
|
|
703
|
+
print(f'You have selected a low-spin state, multiplicity = {spin}')
|
|
704
|
+
# report to stdout
|
|
705
|
+
if split[0] < 0 and not high_spin:
|
|
706
|
+
if abs(split[0]) > 5:
|
|
707
|
+
print('warning, ANN predicts a high spin ground state for this complex')
|
|
708
|
+
else:
|
|
709
|
+
print(
|
|
710
|
+
'warning, ANN predicts a near degenerate ground state for this complex')
|
|
711
|
+
elif split[0] >= 0 and high_spin:
|
|
712
|
+
if abs(split[0]) > 5:
|
|
713
|
+
print('warning, ANN predicts a low spin ground state for this complex')
|
|
714
|
+
else:
|
|
715
|
+
print(
|
|
716
|
+
'warning, ANN predicts a near degenerate ground state for this complex')
|
|
717
|
+
# print(f'delta is {float(split[0]):.2f} spin is {high_spin}')
|
|
718
|
+
print(f"ANN predicts a spin splitting (HS - LS) of {float(split[0]):.2f} kcal/mol at {100 * alpha:.0f}% HFX")
|
|
719
|
+
print(('ANN low spin bond length (ax1/ax2/eq) is predicted to be: ' + " /".join(
|
|
720
|
+
["{0:.2f}".format(float(i)) for i in r_ls[0]]) + ' angstrom'))
|
|
721
|
+
print(('ANN high spin bond length (ax1/ax2/eq) is predicted to be: ' + " /".join(
|
|
722
|
+
["{0:.2f}".format(float(i)) for i in r_hs[0]]) + ' angstrom'))
|
|
723
|
+
print(f'distance to splitting energy training data is {split_dist:.2f}')
|
|
724
|
+
print(ANN_trust_message)
|
|
725
|
+
print(f"ANN predicts a HOMO value of {float(homo[0]):.2f} eV at {100 * alpha:.0f}% HFX")
|
|
726
|
+
print(f"ANN predicts a LUMO-HOMO energetic gap value of {float(gap[0]):.2f} eV at {100 * alpha:.0f}% HFX")
|
|
727
|
+
print(HOMO_ANN_trust_message)
|
|
728
|
+
print(f'distance to HOMO training data is {homo_dist:.2f}')
|
|
729
|
+
print(f'distance to GAP training data is {gap_dist:.2f}')
|
|
730
|
+
print("*******************************************************************")
|
|
731
|
+
print("************** ANN complete, saved in record file *****************")
|
|
732
|
+
print("*******************************************************************")
|
|
733
|
+
from tensorflow.keras import backend as K
|
|
734
|
+
# This is done to get rid of the attribute error that is a bug in tensorflow.
|
|
735
|
+
K.clear_session()
|
|
736
|
+
return ANN_attributes
|
|
737
|
+
|
|
738
|
+
|
|
739
|
+
def evaluate_catalytic_anns(this_complex: mol3D, metal: str, ox: int, spin: int,
|
|
740
|
+
custom_ligand_dict: Dict[str, list],
|
|
741
|
+
net_lig_charge: int, exchange: Union[str, float, int],
|
|
742
|
+
debug: bool = False) -> Dict[str, Any]:
|
|
743
|
+
ANN_attributes: Dict[str, Any] = {}
|
|
744
|
+
# build RACs without geo
|
|
745
|
+
with DebugTimer('getting RACs', debug):
|
|
746
|
+
descriptor_names, descriptors = get_descriptor_vector(
|
|
747
|
+
this_complex, custom_ligand_dict, ox_modifier={metal: ox})
|
|
748
|
+
# get alpha
|
|
749
|
+
alpha = 20.0 # default for B3LYP
|
|
750
|
+
if exchange:
|
|
751
|
+
try:
|
|
752
|
+
if float(exchange) < 1:
|
|
753
|
+
alpha = float(exchange) * 100 # if given as %
|
|
754
|
+
elif float(exchange) >= 1:
|
|
755
|
+
alpha = float(exchange)
|
|
756
|
+
except ValueError:
|
|
757
|
+
print('cannot cast exchange argument to float, using 20%')
|
|
758
|
+
descriptor_names += ['alpha', 'ox', 'spin', 'charge_lig']
|
|
759
|
+
descriptors += [alpha, ox, spin, net_lig_charge]
|
|
760
|
+
|
|
761
|
+
with DebugTimer('split ANN', debug):
|
|
762
|
+
oxo, latent_oxo = ANN_supervisor('oxo', descriptors, descriptor_names, debug)
|
|
763
|
+
|
|
764
|
+
with DebugTimer('min oxo dist', debug):
|
|
765
|
+
oxo_dist, avg_10_NN_dist, avg_traintrain = find_ANN_10_NN_normalized_latent_dist("oxo", latent_oxo, debug)
|
|
766
|
+
|
|
767
|
+
ANN_attributes.update({'oxo': oxo[0][0]})
|
|
768
|
+
ANN_attributes.update({'oxo_dist': oxo_dist})
|
|
769
|
+
|
|
770
|
+
with DebugTimer('HAT ANN', debug):
|
|
771
|
+
hat, latent_hat = ANN_supervisor('hat', descriptors, descriptor_names, debug)
|
|
772
|
+
|
|
773
|
+
with DebugTimer('min hat dist', debug):
|
|
774
|
+
hat_dist, avg_10_NN_dist, avg_traintrain = find_ANN_10_NN_normalized_latent_dist("hat", latent_hat, debug)
|
|
775
|
+
|
|
776
|
+
ANN_attributes.update({'hat': hat[0][0]})
|
|
777
|
+
ANN_attributes.update({'hat_dist': hat_dist})
|
|
778
|
+
|
|
779
|
+
# ######### for Oxo and HOMO optimization ##########
|
|
780
|
+
with DebugTimer('oxo20 ANN', debug):
|
|
781
|
+
oxo20, latent_oxo20 = ANN_supervisor('oxo20', descriptors, descriptor_names, debug)
|
|
782
|
+
|
|
783
|
+
with DebugTimer('min oxo20 dist', debug):
|
|
784
|
+
oxo20_dist, avg_10_NN_dist, avg_traintrain = find_ANN_10_NN_normalized_latent_dist("oxo20", latent_oxo20, debug)
|
|
785
|
+
|
|
786
|
+
ANN_attributes.update({'oxo20': oxo20[0][0]})
|
|
787
|
+
ANN_attributes.update({'oxo20_dist': oxo20_dist})
|
|
788
|
+
# _ = find_ANN_latent_dist("oxo20", latent_oxo20, debug)
|
|
789
|
+
# _ = find_true_min_eu_dist("oxo20", descriptors, descriptor_names, latent_space_vector=latent_oxo20)
|
|
790
|
+
|
|
791
|
+
with DebugTimer('home_empty ANN', debug):
|
|
792
|
+
homo_empty, latent_homo_empty = ANN_supervisor('homo_empty', descriptors, descriptor_names, debug)
|
|
793
|
+
|
|
794
|
+
with DebugTimer('min homo_empty_dist', debug):
|
|
795
|
+
homo_empty_dist, _, _ = find_ANN_10_NN_normalized_latent_dist("homo_empty", latent_homo_empty, debug)
|
|
796
|
+
|
|
797
|
+
ANN_attributes.update({'homo_empty': homo_empty[0][0]})
|
|
798
|
+
ANN_attributes.update({'homo_empty_dist': homo_empty_dist})
|
|
799
|
+
# _ = find_ANN_latent_dist("homo_empty", latent_homo_empty, debug)
|
|
800
|
+
# _ = find_true_min_eu_dist("homo_empty", descriptors, descriptor_names, latent_space_vector=latent_homo_empty)
|
|
801
|
+
|
|
802
|
+
Oxo20_ANN_trust = 'not set'
|
|
803
|
+
Oxo20_ANN_trust_message = ""
|
|
804
|
+
# Not quite sure if this should be divided by 3 or not, since RAC-155 descriptors
|
|
805
|
+
if float(oxo20_dist) < 0.75:
|
|
806
|
+
Oxo20_ANN_trust_message = 'Oxo20 ANN results should be trustworthy for this complex '
|
|
807
|
+
Oxo20_ANN_trust = 'high'
|
|
808
|
+
elif float(oxo20_dist) < 1:
|
|
809
|
+
Oxo20_ANN_trust_message = 'Oxo20 ANN results are probably useful for this complex '
|
|
810
|
+
Oxo20_ANN_trust = 'medium'
|
|
811
|
+
elif float(oxo20_dist) <= 1.25:
|
|
812
|
+
Oxo20_ANN_trust_message = 'Oxo20 ANN results are fairly far from training data, be cautious '
|
|
813
|
+
Oxo20_ANN_trust = 'low'
|
|
814
|
+
elif float(oxo20_dist) > 1.25:
|
|
815
|
+
Oxo20_ANN_trust_message = 'Oxo20 ANN results are too far from training data, be cautious '
|
|
816
|
+
Oxo20_ANN_trust = 'very low'
|
|
817
|
+
ANN_attributes.update({'oxo20_trust': Oxo20_ANN_trust})
|
|
818
|
+
|
|
819
|
+
homo_empty_ANN_trust = 'not set'
|
|
820
|
+
homo_empty_ANN_trust_message = ""
|
|
821
|
+
# Not quite sure if this should be divided by 3 or not, since RAC-155 descriptors
|
|
822
|
+
if float(homo_empty_dist) < 0.75:
|
|
823
|
+
homo_empty_ANN_trust_message = 'homo_empty ANN results should be trustworthy for this complex '
|
|
824
|
+
homo_empty_ANN_trust = 'high'
|
|
825
|
+
elif float(homo_empty_dist) < 1:
|
|
826
|
+
homo_empty_ANN_trust_message = 'homo_empty ANN results are probably useful for this complex '
|
|
827
|
+
homo_empty_ANN_trust = 'medium'
|
|
828
|
+
elif float(homo_empty_dist) <= 1.25:
|
|
829
|
+
homo_empty_ANN_trust_message = 'homo_empty ANN results are fairly far from training data, be cautious '
|
|
830
|
+
homo_empty_ANN_trust = 'low'
|
|
831
|
+
elif float(homo_empty_dist) > 1.25:
|
|
832
|
+
homo_empty_ANN_trust_message = 'homo_empty ANN results are too far from training data, be cautious '
|
|
833
|
+
homo_empty_ANN_trust = 'very low'
|
|
834
|
+
ANN_attributes.update({'homo_empty_trust': homo_empty_ANN_trust})
|
|
835
|
+
|
|
836
|
+
####################################################
|
|
837
|
+
|
|
838
|
+
Oxo_ANN_trust = 'not set'
|
|
839
|
+
Oxo_ANN_trust_message = ""
|
|
840
|
+
# Not quite sure if this should be divided by 3 or not, since RAC-155 descriptors
|
|
841
|
+
if float(oxo_dist) < 3:
|
|
842
|
+
Oxo_ANN_trust_message = 'Oxo ANN results should be trustworthy for this complex '
|
|
843
|
+
Oxo_ANN_trust = 'high'
|
|
844
|
+
elif float(oxo_dist) < 5:
|
|
845
|
+
Oxo_ANN_trust_message = 'Oxo ANN results are probably useful for this complex '
|
|
846
|
+
Oxo_ANN_trust = 'medium'
|
|
847
|
+
elif float(oxo_dist) <= 10:
|
|
848
|
+
Oxo_ANN_trust_message = 'Oxo ANN results are fairly far from training data, be cautious '
|
|
849
|
+
Oxo_ANN_trust = 'low'
|
|
850
|
+
elif float(oxo_dist) > 10:
|
|
851
|
+
Oxo_ANN_trust_message = 'Oxo ANN results are too far from training data, be cautious '
|
|
852
|
+
Oxo_ANN_trust = 'very low'
|
|
853
|
+
ANN_attributes.update({'oxo_trust': Oxo_ANN_trust})
|
|
854
|
+
|
|
855
|
+
HAT_ANN_trust = 'not set'
|
|
856
|
+
HAT_ANN_trust_message = ""
|
|
857
|
+
# Not quite sure if this should be divided by 3 or not, since RAC-155 descriptors
|
|
858
|
+
if float(hat_dist) < 3:
|
|
859
|
+
HAT_ANN_trust_message = 'HAT ANN results should be trustworthy for this complex '
|
|
860
|
+
HAT_ANN_trust = 'high'
|
|
861
|
+
elif float(hat_dist) < 5:
|
|
862
|
+
HAT_ANN_trust_message = 'HAT ANN results are probably useful for this complex '
|
|
863
|
+
HAT_ANN_trust = 'medium'
|
|
864
|
+
elif float(hat_dist) <= 10:
|
|
865
|
+
HAT_ANN_trust_message = 'HAT ANN results are fairly far from training data, be cautious '
|
|
866
|
+
HAT_ANN_trust = 'low'
|
|
867
|
+
elif float(hat_dist) > 10:
|
|
868
|
+
HAT_ANN_trust_message = 'HAT ANN results are too far from training data, be cautious '
|
|
869
|
+
HAT_ANN_trust = 'very low'
|
|
870
|
+
ANN_attributes.update({'hat_trust': HAT_ANN_trust})
|
|
871
|
+
print("*******************************************************************")
|
|
872
|
+
print("************** CATALYTIC ANN ACTIVATED! ****************")
|
|
873
|
+
print("*********** Currently advising on Oxo and HAT energies ************")
|
|
874
|
+
print("*******************************************************************")
|
|
875
|
+
print(f"ANN predicts a Oxo20 energy of {float(oxo20[0]):.2f} kcal/mol at {alpha:.2f}% HFX")
|
|
876
|
+
print(Oxo20_ANN_trust_message)
|
|
877
|
+
print(f'Distance to Oxo20 training data in the latent space is {oxo20_dist:.2f}')
|
|
878
|
+
print(f"ANN predicts a empty site beta HOMO level of {float(homo_empty[0]):.2f} eV at {alpha:.2f} % HFX")
|
|
879
|
+
print(homo_empty_ANN_trust_message)
|
|
880
|
+
print(f'Distance to empty site beta HOMO level training data in the latent space is {homo_empty_dist:.2f}')
|
|
881
|
+
print('-------------------------------------------------------------------')
|
|
882
|
+
print(f"ANN predicts a oxo formation energy of {float(oxo[0]):.2f} kcal/mol at {alpha:.2f}% HFX")
|
|
883
|
+
print(Oxo_ANN_trust_message)
|
|
884
|
+
print(f'Distance to oxo training data in the latent space is {oxo_dist:.2f}')
|
|
885
|
+
print(f"ANN predicts a HAT energy of {float(hat[0]):.2f} kcal/mol at {alpha:.2f}% HFX")
|
|
886
|
+
print(HAT_ANN_trust_message)
|
|
887
|
+
print(f'Distance to HAT training data in the latent space is {hat_dist:.2f}')
|
|
888
|
+
print("*******************************************************************")
|
|
889
|
+
print("************** ANN complete, saved in record file *****************")
|
|
890
|
+
print("*******************************************************************")
|
|
891
|
+
from tensorflow.keras import backend as K
|
|
892
|
+
# This is done to get rid of the attribute error that is a bug in tensorflow.
|
|
893
|
+
K.clear_session()
|
|
894
|
+
return ANN_attributes
|