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,617 @@
|
|
|
1
|
+
# @file distgeom.py
|
|
2
|
+
# Implements a basic distance geometry conformer search routine
|
|
3
|
+
#
|
|
4
|
+
# Written by Terry Gani for HJK Group
|
|
5
|
+
# Modified for improved support of bidentates on 07/08/2019 by Daniel Harper
|
|
6
|
+
#
|
|
7
|
+
# Dpt of Chemical Engineering, MIT
|
|
8
|
+
#
|
|
9
|
+
# Adapted from:
|
|
10
|
+
#
|
|
11
|
+
# [1] J. M. Blaney and J. S. Dixon, "Distance Geometry in Molecular Modeling",
|
|
12
|
+
# in Reviews in Computational Chemistry, VCH (1994)
|
|
13
|
+
#
|
|
14
|
+
# [2] G. Crippen and T. F. Havel, "Distance Geometry and Molecular Conformation",
|
|
15
|
+
# in Chemometrics Research Studies Series, Wiley (1988)
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
import numpy
|
|
19
|
+
try:
|
|
20
|
+
from openbabel import openbabel # version 3 style import
|
|
21
|
+
except ImportError:
|
|
22
|
+
import openbabel # fallback to version 2
|
|
23
|
+
from scipy import optimize
|
|
24
|
+
from math import sqrt, cos
|
|
25
|
+
|
|
26
|
+
from typing import Dict
|
|
27
|
+
from molSimplify.Classes.atom3D import atom3D
|
|
28
|
+
from molSimplify.Classes.mol3D import mol3D
|
|
29
|
+
from molSimplify.Classes.globalvars import (vdwrad)
|
|
30
|
+
from molSimplify.Scripts.geometry import (distance,
|
|
31
|
+
norm,
|
|
32
|
+
vecangle,
|
|
33
|
+
vecdiff)
|
|
34
|
+
from molSimplify.Scripts.io import (lig_load, loadcoord)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def CosRule(AB: float, BC: float, theta: float) -> float:
|
|
38
|
+
"""Applies the cosine rule to get the length of AC given lengths of AB, BC and angle ABC
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
AB : float
|
|
43
|
+
Length of AB.
|
|
44
|
+
BC : float
|
|
45
|
+
Length of BC.
|
|
46
|
+
theta : float
|
|
47
|
+
theta Angle in degrees.
|
|
48
|
+
|
|
49
|
+
Returns
|
|
50
|
+
-------
|
|
51
|
+
AC : float
|
|
52
|
+
Length of AC.
|
|
53
|
+
|
|
54
|
+
"""
|
|
55
|
+
theta = np.pi*theta/180
|
|
56
|
+
AC = sqrt(AB**2+BC**2-2*AB*BC*cos(theta))
|
|
57
|
+
return AC
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def inverseCosRule(A, B, C) -> float:
|
|
61
|
+
"""Apply the cosine rule to find the angle ABC given points A,B, and C.
|
|
62
|
+
|
|
63
|
+
Parameters
|
|
64
|
+
----------
|
|
65
|
+
A : list
|
|
66
|
+
Coordinates of A.
|
|
67
|
+
B : list
|
|
68
|
+
Coordinates of B.
|
|
69
|
+
C : list
|
|
70
|
+
Coordinates of C.
|
|
71
|
+
|
|
72
|
+
Returns
|
|
73
|
+
-------
|
|
74
|
+
theta : float
|
|
75
|
+
ABC angle theta in grees.
|
|
76
|
+
|
|
77
|
+
"""
|
|
78
|
+
BA = np.linalg.norm(np.array(A)-np.array(B))
|
|
79
|
+
BC = np.linalg.norm(np.array(C)-np.array(B))
|
|
80
|
+
AC = np.linalg.norm(np.array(C)-np.array(A))
|
|
81
|
+
theta = np.arccos((BA**2+BC**2-AC**2)/(2*BA*BC))
|
|
82
|
+
return np.rad2deg(theta)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def GetBoundsMatrices(mol, natoms, catoms=[], shape=[], A=[]):
|
|
86
|
+
"""Generate distance bounds matrices. The basic idea is outlined in ref [1].
|
|
87
|
+
We first apply 1-2 (bond length) and 1-3 (bond angle) constraints, read from the FF-optimized initial conformer.
|
|
88
|
+
Next, to bias the search towards coordinating conformers, approximate connection atom distance constraints based
|
|
89
|
+
on topological distances are also included.
|
|
90
|
+
|
|
91
|
+
Parameters
|
|
92
|
+
----------
|
|
93
|
+
mol : mol3D
|
|
94
|
+
mol3D class instance of molecule.
|
|
95
|
+
natoms : int
|
|
96
|
+
Number of atoms in the molecule.
|
|
97
|
+
catoms : list, optional
|
|
98
|
+
List of ligand connection atoms. Default is Empty.
|
|
99
|
+
shape : dict
|
|
100
|
+
Dict containing angles.
|
|
101
|
+
A : list
|
|
102
|
+
List of lists making a distance 2 connectivity matrix.
|
|
103
|
+
|
|
104
|
+
Returns
|
|
105
|
+
-------
|
|
106
|
+
LB : np.array
|
|
107
|
+
Lower bound matrix.
|
|
108
|
+
UB : np.array
|
|
109
|
+
Upper bound matrix.
|
|
110
|
+
|
|
111
|
+
"""
|
|
112
|
+
LB = np.zeros((natoms, natoms)) # lower bound
|
|
113
|
+
UB = np.zeros((natoms, natoms)) # upper bound, both symmetric
|
|
114
|
+
# Set constraints for all atoms excluding the dummy metal atom
|
|
115
|
+
for i in range(natoms-1):
|
|
116
|
+
for j in range(natoms-1):
|
|
117
|
+
# 1-2 constraints: UB = LB = BL
|
|
118
|
+
if mol.OBMol.GetBond(i+1, j+1) is not None:
|
|
119
|
+
UB[i][j] = distance(mol.getAtomCoords(i), mol.getAtomCoords(j))
|
|
120
|
+
UB[j][i] = distance(mol.getAtomCoords(i), mol.getAtomCoords(j))
|
|
121
|
+
LB[i][j] = distance(mol.getAtomCoords(i), mol.getAtomCoords(j))
|
|
122
|
+
LB[j][i] = distance(mol.getAtomCoords(i), mol.getAtomCoords(j))
|
|
123
|
+
for i in range(natoms-1):
|
|
124
|
+
for j in range(natoms-1):
|
|
125
|
+
for k in range(natoms-1):
|
|
126
|
+
# 1-3 constraints: UB = LB = BL
|
|
127
|
+
if mol.OBMol.GetBond(i+1, j+1) is not None and mol.OBMol.GetBond(j+1, k+1) is not None and j != k and i != k:
|
|
128
|
+
AB = vecdiff(mol.getAtomCoords(j), mol.getAtomCoords(i))
|
|
129
|
+
BC = vecdiff(mol.getAtomCoords(k), mol.getAtomCoords(j))
|
|
130
|
+
UB[i][k] = CosRule(norm(AB), norm(BC),
|
|
131
|
+
180-vecangle(AB, BC))
|
|
132
|
+
UB[k][i] = CosRule(norm(AB), norm(BC),
|
|
133
|
+
180-vecangle(AB, BC))
|
|
134
|
+
LB[i][k] = CosRule(norm(AB), norm(BC),
|
|
135
|
+
180-vecangle(AB, BC))
|
|
136
|
+
LB[k][i] = CosRule(norm(AB), norm(BC),
|
|
137
|
+
180-vecangle(AB, BC))
|
|
138
|
+
|
|
139
|
+
# Set constraints for atoms bonded to the dummy metal atom
|
|
140
|
+
# Currently assumes all M-L bonds are 2 Angstroms
|
|
141
|
+
dummy_idx = natoms-1
|
|
142
|
+
M_L_bond = 2
|
|
143
|
+
for catom in catoms:
|
|
144
|
+
# Set 1-2 constraints
|
|
145
|
+
UB[catom][dummy_idx] = M_L_bond
|
|
146
|
+
UB[dummy_idx][catom] = M_L_bond
|
|
147
|
+
LB[catom][dummy_idx] = M_L_bond
|
|
148
|
+
LB[dummy_idx][catom] = M_L_bond
|
|
149
|
+
if len(catoms) > 1:
|
|
150
|
+
# Set 1-3 contraints for ligating atoms
|
|
151
|
+
for i in range(len(catoms[:-1])):
|
|
152
|
+
for j in range(i+1, len(catoms)):
|
|
153
|
+
angle = shape[str(i)+'-'+str(j)]
|
|
154
|
+
lig_distance = CosRule(M_L_bond, M_L_bond, angle)
|
|
155
|
+
UB[catoms[i]][catoms[j]] = lig_distance
|
|
156
|
+
UB[catoms[j]][catoms[i]] = lig_distance
|
|
157
|
+
LB[catoms[i]][catoms[j]] = lig_distance
|
|
158
|
+
LB[catoms[j]][catoms[i]] = lig_distance
|
|
159
|
+
|
|
160
|
+
expanded_vdwrad = vdwrad.copy()
|
|
161
|
+
expanded_vdwrad['Fe'] = 1.5 # Default vdw radius for the dummy metal is 1.5
|
|
162
|
+
for i in range(natoms):
|
|
163
|
+
for j in range(i):
|
|
164
|
+
# fill LBs with sums of vdW radii and UBs with arbitrary large cutoff
|
|
165
|
+
if LB[i][j] == 0:
|
|
166
|
+
LB[i][j] = expanded_vdwrad[mol.getAtom(
|
|
167
|
+
i).sym] + expanded_vdwrad[mol.getAtom(j).sym]
|
|
168
|
+
LB[j][i] = expanded_vdwrad[mol.getAtom(
|
|
169
|
+
i).sym] + expanded_vdwrad[mol.getAtom(j).sym]
|
|
170
|
+
UB[i][j] = 100
|
|
171
|
+
UB[j][i] = 100
|
|
172
|
+
return LB, UB
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def Triangle(LB, UB, natoms):
|
|
176
|
+
"""Triangle inequality bounds smoothing. Copied from ref [2], pp. 252-253.
|
|
177
|
+
Scales O(N^3).
|
|
178
|
+
|
|
179
|
+
Parameters
|
|
180
|
+
----------
|
|
181
|
+
LB : np.array
|
|
182
|
+
Lower bounds matrix.
|
|
183
|
+
UB : np.array
|
|
184
|
+
Upper bounds matrix.
|
|
185
|
+
natoms : int
|
|
186
|
+
Number of atoms in the molecule.
|
|
187
|
+
|
|
188
|
+
Returns
|
|
189
|
+
-------
|
|
190
|
+
LL : np.array
|
|
191
|
+
Lower triangularized bound matrix
|
|
192
|
+
UL : np.array
|
|
193
|
+
Upper triangularized bound matrix
|
|
194
|
+
|
|
195
|
+
"""
|
|
196
|
+
LL = LB
|
|
197
|
+
UL = UB
|
|
198
|
+
for k in range(natoms):
|
|
199
|
+
for i in range(natoms-1):
|
|
200
|
+
for j in range(i, natoms):
|
|
201
|
+
if UL[i][j] > UL[i][k] + UL[k][j]:
|
|
202
|
+
UL[i][j] = UL[i][k] + UL[k][j]
|
|
203
|
+
UL[j][i] = UL[i][k] + UL[k][j]
|
|
204
|
+
if LL[i][j] < LL[i][k] - UL[k][j]:
|
|
205
|
+
LL[i][j] = LL[i][k] - UL[k][j]
|
|
206
|
+
LL[j][i] = LL[i][k] - UL[k][j]
|
|
207
|
+
else:
|
|
208
|
+
if LL[i][j] < LL[j][k] - UL[k][i]:
|
|
209
|
+
LL[i][j] = LL[j][k] - UL[k][i]
|
|
210
|
+
LL[j][i] = LL[j][k] - UL[k][i]
|
|
211
|
+
return LL, UL
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def Metrize(LB, UB, natoms, Full=False, seed=False):
|
|
215
|
+
"""Metrization to select random in-range distances. Copied from ref [2], pp. 253-254.
|
|
216
|
+
Scales O(N^3).
|
|
217
|
+
|
|
218
|
+
Parameters
|
|
219
|
+
----------
|
|
220
|
+
LB : np.array
|
|
221
|
+
Lower bounds matrix.
|
|
222
|
+
UB : np.array
|
|
223
|
+
Upper bounds matrix.
|
|
224
|
+
natoms : int
|
|
225
|
+
Number of atoms in the molecule.
|
|
226
|
+
Full : bool, optional
|
|
227
|
+
Flag for full metrization (scales O(N^5)). Default is False.
|
|
228
|
+
seed : bool, optional
|
|
229
|
+
Flag for random number seed. Default is False.
|
|
230
|
+
|
|
231
|
+
Returns
|
|
232
|
+
-------
|
|
233
|
+
D : np.array
|
|
234
|
+
Distance matrix.
|
|
235
|
+
|
|
236
|
+
"""
|
|
237
|
+
if seed:
|
|
238
|
+
numpy.random.seed(seed)
|
|
239
|
+
D = np.zeros((natoms, natoms))
|
|
240
|
+
LB, UB = Triangle(LB, UB, natoms)
|
|
241
|
+
# First generate a random distance for all atom pairings not involving
|
|
242
|
+
# the metal. TODO: j should start from i+1 to ensure the diagonal is
|
|
243
|
+
# zero.
|
|
244
|
+
for i in range(natoms-1):
|
|
245
|
+
for j in range(i, natoms-1):
|
|
246
|
+
# ~ if Full:
|
|
247
|
+
# ~ LB, UB = Triangle(LB, UB, natoms)
|
|
248
|
+
if UB[i][j] < LB[i][j]: # ensure that the upper bound is larger than the lower bound
|
|
249
|
+
UB[i][j] = LB[i][j]
|
|
250
|
+
D[i][j] = np.random.uniform(LB[i][j], UB[i][j])
|
|
251
|
+
D[j][i] = D[i][j]
|
|
252
|
+
|
|
253
|
+
# For pairs involving the metal, set the distance to 100 Angstroms
|
|
254
|
+
# regardless of the triangle rule. This encourages the algorithm to
|
|
255
|
+
# select conformations which don't crowd the metal, as these often lead
|
|
256
|
+
# to failure. TODO: loop over j should only run to natoms - 1 to avoid
|
|
257
|
+
# writing to the diagonal.
|
|
258
|
+
for j in range(natoms):
|
|
259
|
+
if UB[natoms-1][j] < LB[natoms-1][j]: # ensure that the upper bound is larger than the lower bound
|
|
260
|
+
UB[natoms-1][j] = LB[natoms-1][j]
|
|
261
|
+
D[natoms-1][j] = 100
|
|
262
|
+
D[j][natoms-1] = D[natoms-1][j]
|
|
263
|
+
return D
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def GetCMDists(D, natoms):
|
|
267
|
+
"""Get distances of each atom to center of mass given the distance matrix.
|
|
268
|
+
Copied from ref [2], pp. 309.
|
|
269
|
+
|
|
270
|
+
Parameters
|
|
271
|
+
----------
|
|
272
|
+
D : np.array
|
|
273
|
+
Distance matrix.
|
|
274
|
+
natoms : int
|
|
275
|
+
Number of atoms in the molecule.
|
|
276
|
+
|
|
277
|
+
Returns
|
|
278
|
+
-------
|
|
279
|
+
D0 : np.array
|
|
280
|
+
Vector of distances from center of mass.
|
|
281
|
+
status : bool
|
|
282
|
+
Flag for successful search.
|
|
283
|
+
|
|
284
|
+
"""
|
|
285
|
+
D0 = np.zeros(natoms)
|
|
286
|
+
for i in range(natoms):
|
|
287
|
+
for j in range(natoms):
|
|
288
|
+
D0[i] += D[i][j]**2/natoms
|
|
289
|
+
for j in range(natoms):
|
|
290
|
+
for k in range(j, natoms):
|
|
291
|
+
D0[i] -= (D[j][k])**2/natoms**2
|
|
292
|
+
try:
|
|
293
|
+
D0[i] = sqrt(D0[i])
|
|
294
|
+
except ValueError:
|
|
295
|
+
# If the triangle inequality is not sastisfied D0[i]
|
|
296
|
+
# is negative and sqrt raises a value error.
|
|
297
|
+
return D0, False
|
|
298
|
+
return D0, True
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def GetMetricMatrix(D, D0, natoms):
|
|
302
|
+
"""Get metric matrix from distance matrix and CM distances
|
|
303
|
+
Copied from ref [2], pp. 306.
|
|
304
|
+
|
|
305
|
+
Parameters
|
|
306
|
+
----------
|
|
307
|
+
D : np.array
|
|
308
|
+
Distance matrix.
|
|
309
|
+
D0 : np.array
|
|
310
|
+
Vector of distances from center of mass.
|
|
311
|
+
natoms : int
|
|
312
|
+
Number of atoms in the molecule.
|
|
313
|
+
|
|
314
|
+
Returns
|
|
315
|
+
-------
|
|
316
|
+
G : np.array
|
|
317
|
+
Metric matrix.
|
|
318
|
+
|
|
319
|
+
"""
|
|
320
|
+
G = np.zeros((natoms, natoms))
|
|
321
|
+
for i in range(natoms):
|
|
322
|
+
for j in range(natoms):
|
|
323
|
+
G[i][j] = (D0[i]**2 + D0[j]**2 - D[i][j]**2)/2
|
|
324
|
+
return G
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
def Get3Eigs(G, natoms):
|
|
328
|
+
"""Gets 3 largest eigenvalues and corresponding eigenvectors of metric matrix
|
|
329
|
+
|
|
330
|
+
Parameters
|
|
331
|
+
----------
|
|
332
|
+
G : np.array
|
|
333
|
+
Metric matrix.
|
|
334
|
+
natoms : int
|
|
335
|
+
Number of atoms in the molecule.
|
|
336
|
+
|
|
337
|
+
Returns
|
|
338
|
+
-------
|
|
339
|
+
L : np.array
|
|
340
|
+
Three largest eigenvalues
|
|
341
|
+
V : np.array
|
|
342
|
+
Eigenvectors corresponding to largest eigenvalues.
|
|
343
|
+
|
|
344
|
+
"""
|
|
345
|
+
L = np.zeros((3, 3))
|
|
346
|
+
V = np.zeros((natoms, 3))
|
|
347
|
+
l, v = np.linalg.eigh(G)
|
|
348
|
+
for i in [0, 1, 2]:
|
|
349
|
+
# print('natoms is '+ str(natoms))
|
|
350
|
+
# print('l is '+ str(l))
|
|
351
|
+
L[i][i] = sqrt(max(l[natoms-1-i], 0))
|
|
352
|
+
V[:, i] = v[:, natoms-1-i]
|
|
353
|
+
return L, V
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def DistErr(x, *args):
|
|
357
|
+
"""Computes distance error function for scipy optimization.
|
|
358
|
+
Copied from E3 in pp. 311 of ref. [1]
|
|
359
|
+
|
|
360
|
+
Parameters
|
|
361
|
+
----------
|
|
362
|
+
x : np.array
|
|
363
|
+
1D array of coordinates to be optimized.
|
|
364
|
+
*args : dict
|
|
365
|
+
Other parameters (refer to scipy.optimize docs)
|
|
366
|
+
|
|
367
|
+
Returns
|
|
368
|
+
-------
|
|
369
|
+
E : np.array
|
|
370
|
+
Objective function
|
|
371
|
+
|
|
372
|
+
"""
|
|
373
|
+
E = 0
|
|
374
|
+
LB, UB, natoms = args
|
|
375
|
+
for i in range(natoms-1):
|
|
376
|
+
for j in range(i+1, natoms):
|
|
377
|
+
ri = [x[3*i], x[3*i+1], x[3*i+2]]
|
|
378
|
+
rj = [x[3*j], x[3*j+1], x[3*j+2]]
|
|
379
|
+
dij = distance(ri, rj)
|
|
380
|
+
uij = UB[i][j]
|
|
381
|
+
lij = LB[i][j]
|
|
382
|
+
E += (dij**2/(uij**2) - 1)**2
|
|
383
|
+
E += (2*lij**2/(lij**2 + dij**2) - 1)**2
|
|
384
|
+
return np.asarray(E)
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def DistErrGrad(x, *args):
|
|
388
|
+
"""Computes gradient of distance error function for scipy optimization.
|
|
389
|
+
Copied from E3 in pp. 311 of ref. [1]
|
|
390
|
+
|
|
391
|
+
Parameters
|
|
392
|
+
----------
|
|
393
|
+
x : np.array
|
|
394
|
+
1D array of coordinates to be optimized.
|
|
395
|
+
*args : dict
|
|
396
|
+
Other parameters (refer to scipy.optimize docs)
|
|
397
|
+
|
|
398
|
+
Returns
|
|
399
|
+
-------
|
|
400
|
+
g : np.array
|
|
401
|
+
Objective function gradient
|
|
402
|
+
|
|
403
|
+
"""
|
|
404
|
+
LB, UB, natoms = args
|
|
405
|
+
g = np.zeros(3*natoms)
|
|
406
|
+
for i in range(natoms):
|
|
407
|
+
jr = list(range(natoms))
|
|
408
|
+
jr.remove(i)
|
|
409
|
+
for j in jr:
|
|
410
|
+
ri = [x[3*i], x[3*i+1], x[3*i+2]]
|
|
411
|
+
rj = [x[3*j], x[3*j+1], x[3*j+2]]
|
|
412
|
+
dij = distance(ri, rj)
|
|
413
|
+
uij = UB[i][j]
|
|
414
|
+
lij = LB[i][j]
|
|
415
|
+
g[3*i] += (4*((dij/uij)**2-1)/(uij**2)
|
|
416
|
+
- (8/lij**2)*(2*(lij**2 / (lij**2+dij**2))-1)/((1+(dij/lij)**2)**2))*(x[3*i]-x[3*j]) # xi
|
|
417
|
+
g[3*i+1] += (4*((dij/uij)**2-1)/(uij**2)
|
|
418
|
+
- (8/lij**2)*(2*(lij**2 / (lij**2+dij**2))-1)/((1+(dij/lij)**2)**2))*(x[3*i+1]-x[3*j+1]) # yi
|
|
419
|
+
g[3*i+2] += (4*((dij/uij)**2-1)/(uij**2)
|
|
420
|
+
- (8/lij**2)*(2*(lij**2 / (lij**2+dij**2))-1)/((1+(dij/lij)**2)**2))*(x[3*i+2]-x[3*j+2]) # zi
|
|
421
|
+
return g
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
def SaveConf(X, mol, ffclean=True, catoms=[]):
|
|
425
|
+
"""Further cleans up with OB FF and saves to a new mol3D object.
|
|
426
|
+
Note that distance geometry tends to produce puckered aromatic rings because of the
|
|
427
|
+
lack of explicit impropers, see Riniker et al. JCIM (2015) 55, 2562-74 for details.
|
|
428
|
+
Hence, a FF optimization (with connection atoms constrained) is recommended to clean up the structure.
|
|
429
|
+
|
|
430
|
+
Parameters
|
|
431
|
+
----------
|
|
432
|
+
x : np.array
|
|
433
|
+
Array of coordinates.
|
|
434
|
+
mol : mol3D
|
|
435
|
+
mol3D class instance of original molecule.
|
|
436
|
+
ffclean : bool, optional
|
|
437
|
+
Flag for openbabel forcefield cleanup. Default is True.
|
|
438
|
+
catoms : list, optional
|
|
439
|
+
List of connection atoms used to generate FF constraints if specified. Default is empty.
|
|
440
|
+
|
|
441
|
+
Returns
|
|
442
|
+
-------
|
|
443
|
+
conf3D : mol3D
|
|
444
|
+
mol3D class instance of conformer.
|
|
445
|
+
|
|
446
|
+
"""
|
|
447
|
+
conf3D = mol3D()
|
|
448
|
+
conf3D.copymol3D(mol)
|
|
449
|
+
# set coordinates using OBMol to keep bonding info
|
|
450
|
+
OBMol = conf3D.OBMol
|
|
451
|
+
for i, atom in enumerate(openbabel.OBMolAtomIter(OBMol)):
|
|
452
|
+
atom.SetVector(X[i, 0], X[i, 1], X[i, 2])
|
|
453
|
+
|
|
454
|
+
# First stage of cleaning takes place with the metal still present
|
|
455
|
+
if ffclean:
|
|
456
|
+
ff = openbabel.OBForceField.FindForceField('UFF')
|
|
457
|
+
s = ff.Setup(OBMol)
|
|
458
|
+
if not s:
|
|
459
|
+
print('FF setup failed')
|
|
460
|
+
|
|
461
|
+
for i in range(200):
|
|
462
|
+
ff.SteepestDescent(10)
|
|
463
|
+
ff.ConjugateGradients(10)
|
|
464
|
+
ff.GetCoordinates(OBMol)
|
|
465
|
+
|
|
466
|
+
last_atom_index = OBMol.NumAtoms() # Delete the dummy metal atom that we added earlier
|
|
467
|
+
metal_atom = OBMol.GetAtom(last_atom_index)
|
|
468
|
+
OBMol.DeleteAtom(metal_atom)
|
|
469
|
+
|
|
470
|
+
# Second stage of cleaning removes the metal, but uses constraints on the
|
|
471
|
+
# bonding atoms to ensure a binding conformer is maintained
|
|
472
|
+
# This stage is critical for getting planar aromatic ligands like
|
|
473
|
+
# porphyrin and correct. Not really sure why though...
|
|
474
|
+
if ffclean:
|
|
475
|
+
ff = openbabel.OBForceField.FindForceField('mmff94')
|
|
476
|
+
constr = openbabel.OBFFConstraints()
|
|
477
|
+
for atom in catoms:
|
|
478
|
+
constr.AddAtomConstraint(atom+1)
|
|
479
|
+
s = ff.Setup(OBMol, constr)
|
|
480
|
+
if not s:
|
|
481
|
+
print('FF setup failed')
|
|
482
|
+
|
|
483
|
+
for i in range(200):
|
|
484
|
+
ff.SteepestDescent(10)
|
|
485
|
+
ff.ConjugateGradients(10)
|
|
486
|
+
ff.GetCoordinates(OBMol)
|
|
487
|
+
|
|
488
|
+
conf3D.OBMol = OBMol
|
|
489
|
+
conf3D.convert2mol3D()
|
|
490
|
+
return conf3D
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def findshape(args, master_ligand) -> Dict:
|
|
494
|
+
"""Determines the relative positioning of different ligating atoms
|
|
495
|
+
|
|
496
|
+
Parameters
|
|
497
|
+
----------
|
|
498
|
+
args : Namespace
|
|
499
|
+
Namespace argument from inparse.
|
|
500
|
+
master_ligand : mol3D
|
|
501
|
+
mol3D class instance of metal with the ligand.
|
|
502
|
+
|
|
503
|
+
Returns
|
|
504
|
+
-------
|
|
505
|
+
angles_dict : dict
|
|
506
|
+
A dictionary of angles (in degrees) between catoms.
|
|
507
|
+
|
|
508
|
+
"""
|
|
509
|
+
core = loadcoord(args.geometry)
|
|
510
|
+
|
|
511
|
+
# load ligands and identify the denticity of each
|
|
512
|
+
ligands = []
|
|
513
|
+
for lig in args.lig:
|
|
514
|
+
ligands.append(lig_load(lig)[0])
|
|
515
|
+
# TODO: Found this hardcoded index that will surely fail in certain cases
|
|
516
|
+
# RM 2022/07/15
|
|
517
|
+
number_of_smiles_ligands = 0
|
|
518
|
+
for i, lig in enumerate(ligands):
|
|
519
|
+
if lig.ident == 'smi':
|
|
520
|
+
ligands[i].denticity = len(args.smicat[number_of_smiles_ligands])
|
|
521
|
+
|
|
522
|
+
# Find the binding location of the master_ligand. Start with one since
|
|
523
|
+
# core[0] corresponds to the metal
|
|
524
|
+
bind = 1
|
|
525
|
+
for i, lig in enumerate(ligands):
|
|
526
|
+
if lig.name == master_ligand.name:
|
|
527
|
+
master_denticity = lig.denticity
|
|
528
|
+
break
|
|
529
|
+
else:
|
|
530
|
+
bind += 1*int(args.ligocc[i])*int(lig.denticity)
|
|
531
|
+
else:
|
|
532
|
+
raise ValueError("master_ligand not in args.lig")
|
|
533
|
+
|
|
534
|
+
metal_coords = np.array(core[0])
|
|
535
|
+
ligating_coords = []
|
|
536
|
+
for i in range(master_denticity):
|
|
537
|
+
ligating_coords.append(np.array(core[i + bind]))
|
|
538
|
+
|
|
539
|
+
angles_dict = dict()
|
|
540
|
+
for i in range(len(ligating_coords)):
|
|
541
|
+
for j in range(len(ligating_coords)):
|
|
542
|
+
angles_dict[str(i)+'-'+str(j)] = inverseCosRule(ligating_coords[i],
|
|
543
|
+
metal_coords,
|
|
544
|
+
ligating_coords[j])
|
|
545
|
+
return angles_dict
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
def GetConf(mol, args, catoms=[]):
|
|
549
|
+
"""Uses distance geometry to get a random conformer.
|
|
550
|
+
|
|
551
|
+
Parameters
|
|
552
|
+
----------
|
|
553
|
+
mol : mol3D
|
|
554
|
+
mol3D class instance for molecule of interest.
|
|
555
|
+
args : Namespace
|
|
556
|
+
Namespace argument from inparse.
|
|
557
|
+
catoms : list, optional
|
|
558
|
+
List of connection atoms used to generate additional constraints if specified (see GetBoundsMatrices()).
|
|
559
|
+
Default is empty.
|
|
560
|
+
|
|
561
|
+
Returns
|
|
562
|
+
-------
|
|
563
|
+
Conf3D : mol3D
|
|
564
|
+
mol3D class instance of new conformer.
|
|
565
|
+
|
|
566
|
+
"""
|
|
567
|
+
# Create a mol3D copy with a dummy metal metal
|
|
568
|
+
Conf3D = mol3D()
|
|
569
|
+
Conf3D.copymol3D(mol)
|
|
570
|
+
Conf3D.addAtom(atom3D('Fe', [0, 0, 0])) # Add dummy metal to the mol3D
|
|
571
|
+
dummy_metal = openbabel.OBAtom() # And add the dummy metal to the OBmol
|
|
572
|
+
dummy_metal.SetAtomicNum(26)
|
|
573
|
+
Conf3D.OBMol.AddAtom(dummy_metal)
|
|
574
|
+
for i in catoms:
|
|
575
|
+
Conf3D.OBMol.AddBond(i+1, Conf3D.OBMol.NumAtoms(), 1)
|
|
576
|
+
natoms = Conf3D.natoms
|
|
577
|
+
Conf3D.createMolecularGraph()
|
|
578
|
+
|
|
579
|
+
shape = findshape(args, mol)
|
|
580
|
+
LB, UB = GetBoundsMatrices(Conf3D, natoms, catoms, shape)
|
|
581
|
+
status = False
|
|
582
|
+
while not status:
|
|
583
|
+
D = Metrize(LB, UB, natoms)
|
|
584
|
+
D0, status = GetCMDists(D, natoms)
|
|
585
|
+
G = GetMetricMatrix(D, D0, natoms)
|
|
586
|
+
L, V = Get3Eigs(G, natoms)
|
|
587
|
+
X = np.dot(V, L) # get projection
|
|
588
|
+
x = np.reshape(X, 3*natoms)
|
|
589
|
+
res1 = optimize.fmin_cg(DistErr, x, fprime=DistErrGrad,
|
|
590
|
+
gtol=0.1, args=(LB, UB, natoms), disp=0)
|
|
591
|
+
X = np.reshape(res1, (natoms, 3))
|
|
592
|
+
Conf3D = SaveConf(X, Conf3D, True, catoms)
|
|
593
|
+
|
|
594
|
+
return Conf3D
|
|
595
|
+
|
|
596
|
+
# for testing
|
|
597
|
+
#
|
|
598
|
+
# n4py
|
|
599
|
+
# molsimplify -core ru -lig 'n1ccccc1CN(Cc2ccccn2)C(c3ccccn3)c4ccccn4' water
|
|
600
|
+
# -ligocc 1 1 -smicat [1,15,22,28,8] -spin 1 -ligloc True
|
|
601
|
+
# -geometry oct -rprompt True -ffoption A
|
|
602
|
+
# heptacoordinate water oxidation catalyst
|
|
603
|
+
# molsimplify -core ru -lig 'n1c(C(=O)[O-])cccc1c2cccc(c3cccc(C(=O)[O-])n3)n2' water pyridine
|
|
604
|
+
# -ligocc 1 1 2 -smicat [1,24,23,22] -spin 1 -ligloc True -geometry pbp -ffoption A
|
|
605
|
+
# same water oxidation catalyst in a hexacoordinate binding pattern
|
|
606
|
+
# molsimplify -core ru -lig 'n1c(C(=O)[O-])cccc1c2cccc(c3cccc(C(=O)[O-])n3)n2' water pyridine
|
|
607
|
+
# -ligocc 1 1 2 -smicat [1,24,23] -spin 1 -ligloc True -geometry oct -ffoption A
|
|
608
|
+
# tetrahedral with 2 bidentates
|
|
609
|
+
# molsimplify -core fe -lig 'n1ccccc1c2ccccn2' 'CC(=O)C=C([O-])C' -ligocc 1 1
|
|
610
|
+
# -smicat [[1,12],[3,6]] -ligloc True -geometry thd -ffoption A -rprompt True
|
|
611
|
+
# mol,emsg = lig_load('c1ccc(c(c1)C=NCCN=Cc2ccccc2[O-])[O-]')
|
|
612
|
+
# mol,emsg = lig_load('N(C)1CCN(C)CCCN(C)CCN(C)CCC1')
|
|
613
|
+
# catoms = [7,10,18,19]
|
|
614
|
+
# catoms = [0,4,9,13]
|
|
615
|
+
# mol.convert2mol3D()
|
|
616
|
+
# conf = GetConf(mol,catoms)
|
|
617
|
+
# conf.writexyz('conf')
|