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,1930 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from molSimplify.Classes.mol3D import mol3D
|
|
3
|
+
from molSimplify.Classes.ligand import ligand_breakdown, ligand_assign
|
|
4
|
+
from molSimplify.Scripts.geometry import distance
|
|
5
|
+
from molSimplify.Classes.globalvars import globalvars
|
|
6
|
+
|
|
7
|
+
# ########## UNIT CONVERSION
|
|
8
|
+
HF_to_Kcal_mol = 627.503
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def autocorrelation(mol, prop_vec, orig, d, oct=True, catoms=None, use_dist=False):
|
|
12
|
+
"""Calculate and return the products autocorrelation for a single atom
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
mol : mol3D
|
|
17
|
+
mol3D object to calculate autocorrelation over
|
|
18
|
+
prop_vec : list
|
|
19
|
+
property of atoms in mol in order of index
|
|
20
|
+
orig : int
|
|
21
|
+
zero-indexed starting atom
|
|
22
|
+
d : int
|
|
23
|
+
number of hops to travel
|
|
24
|
+
oct : bool, optional
|
|
25
|
+
Flag is octahedral complex, by default True
|
|
26
|
+
catoms: list, optional
|
|
27
|
+
List of connecting atoms, by default None (uses mol3D.getBondedAtomsSmart)
|
|
28
|
+
use_dist : bool, optional
|
|
29
|
+
Weigh autocorrelation by physical distance of atom from original, by default False
|
|
30
|
+
|
|
31
|
+
Returns
|
|
32
|
+
-------
|
|
33
|
+
result_vector : list
|
|
34
|
+
assembled products autocorrelations
|
|
35
|
+
|
|
36
|
+
"""
|
|
37
|
+
result_vector = np.zeros(d + 1)
|
|
38
|
+
hopped = 0
|
|
39
|
+
active_set = set([orig])
|
|
40
|
+
historical_set = set()
|
|
41
|
+
if not use_dist:
|
|
42
|
+
result_vector[hopped] = prop_vec[orig] * prop_vec[orig]
|
|
43
|
+
else:
|
|
44
|
+
result_vector[hopped] = 0.5 * abs(prop_vec[orig]) ** 2.4 / mol.natoms
|
|
45
|
+
while hopped < (d):
|
|
46
|
+
|
|
47
|
+
hopped += 1
|
|
48
|
+
new_active_set = set()
|
|
49
|
+
for this_atom in active_set:
|
|
50
|
+
# prepare all atoms attached to this connection
|
|
51
|
+
# print('called in AC')
|
|
52
|
+
this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
|
|
53
|
+
for bound_atoms in this_atoms_neighbors:
|
|
54
|
+
if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
|
|
55
|
+
new_active_set.add(bound_atoms)
|
|
56
|
+
# print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
|
|
57
|
+
for inds in new_active_set:
|
|
58
|
+
if not use_dist:
|
|
59
|
+
result_vector[hopped] += prop_vec[orig] * prop_vec[inds]
|
|
60
|
+
else:
|
|
61
|
+
this_dist = distance(mol.getAtom(orig).coords(), mol.getAtom(inds).coords())
|
|
62
|
+
result_vector[hopped] += prop_vec[orig] * prop_vec[inds] / (this_dist * mol.natoms)
|
|
63
|
+
historical_set.update(active_set)
|
|
64
|
+
active_set = new_active_set
|
|
65
|
+
return (result_vector)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def autocorrelation_derivative(mol, prop_vec, orig, d, oct=True, catoms=None):
|
|
69
|
+
"""Returns derivative vector of products autocorrelations
|
|
70
|
+
|
|
71
|
+
Parameters
|
|
72
|
+
----------
|
|
73
|
+
mol : mol3D
|
|
74
|
+
mol3D object to calculate derivatives over
|
|
75
|
+
prop_vec : list
|
|
76
|
+
property of atoms in mol in order of index
|
|
77
|
+
orig : int
|
|
78
|
+
zero-indexed starting atom
|
|
79
|
+
d : int
|
|
80
|
+
number of hops to travel
|
|
81
|
+
oct : bool, optional
|
|
82
|
+
Flag is octahedral complex, by default True
|
|
83
|
+
catoms : list, optional
|
|
84
|
+
List of connecting atom, by default None (use mol3D.getBondedAtomsSmart)
|
|
85
|
+
Returns
|
|
86
|
+
-------
|
|
87
|
+
derivative_mat : list
|
|
88
|
+
RAC derivatives matrix
|
|
89
|
+
|
|
90
|
+
"""
|
|
91
|
+
derivative_mat = np.zeros((d + 1, len(prop_vec)))
|
|
92
|
+
|
|
93
|
+
# loop for each atom
|
|
94
|
+
|
|
95
|
+
hopped = 0
|
|
96
|
+
active_set = set([orig])
|
|
97
|
+
historical_set = set()
|
|
98
|
+
for derivate_ind in range(0, len(prop_vec)):
|
|
99
|
+
if derivate_ind == orig:
|
|
100
|
+
derivative_mat[hopped, derivate_ind] = 2 * prop_vec[orig]
|
|
101
|
+
else:
|
|
102
|
+
derivative_mat[hopped, derivate_ind] = 0
|
|
103
|
+
while hopped < (d):
|
|
104
|
+
|
|
105
|
+
hopped += 1
|
|
106
|
+
new_active_set = set()
|
|
107
|
+
for this_atom in active_set:
|
|
108
|
+
# prepare all atoms attached to this connection
|
|
109
|
+
# print('called in AC')
|
|
110
|
+
this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
|
|
111
|
+
for bound_atoms in this_atoms_neighbors:
|
|
112
|
+
if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
|
|
113
|
+
new_active_set.add(bound_atoms)
|
|
114
|
+
# print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
|
|
115
|
+
for inds in new_active_set:
|
|
116
|
+
for derivate_ind in range(0, len(prop_vec)):
|
|
117
|
+
if derivate_ind == orig:
|
|
118
|
+
derivative_mat[hopped, derivate_ind] += prop_vec[inds]
|
|
119
|
+
elif derivate_ind == inds:
|
|
120
|
+
derivative_mat[hopped, derivate_ind] += prop_vec[orig]
|
|
121
|
+
historical_set.update(active_set)
|
|
122
|
+
active_set = new_active_set
|
|
123
|
+
return (derivative_mat)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def ratiometric(mol, prop_vec_num, prop_vec_den, orig, d, oct=True, catoms=None):
|
|
127
|
+
"""This function returns the ratiometrics for one atom
|
|
128
|
+
|
|
129
|
+
Parameters
|
|
130
|
+
----------
|
|
131
|
+
mol : mol3D class
|
|
132
|
+
prop_vec : vector, property of atoms in mol in order of index
|
|
133
|
+
orig : int, zero-indexed starting atom
|
|
134
|
+
d : int, number of hops to travel
|
|
135
|
+
oct : bool, if complex is octahedral, will use better bond checks
|
|
136
|
+
|
|
137
|
+
Returns
|
|
138
|
+
-------
|
|
139
|
+
result_vector : vector of prop_vec_num / prop_vec_den
|
|
140
|
+
|
|
141
|
+
"""
|
|
142
|
+
result_vector = np.zeros(d + 1)
|
|
143
|
+
hopped = 0
|
|
144
|
+
active_set = set([orig])
|
|
145
|
+
historical_set = set()
|
|
146
|
+
result_vector[hopped] = prop_vec_num[orig] / prop_vec_den[orig]
|
|
147
|
+
"""
|
|
148
|
+
if oct:
|
|
149
|
+
print('using OCT autocorrelation')
|
|
150
|
+
else:
|
|
151
|
+
print('NOT using OCT autocorrelation')
|
|
152
|
+
"""
|
|
153
|
+
while hopped < (d):
|
|
154
|
+
|
|
155
|
+
hopped += 1
|
|
156
|
+
new_active_set = set()
|
|
157
|
+
for this_atom in active_set:
|
|
158
|
+
# prepare all atoms attached to this connection
|
|
159
|
+
# print('called in AC')
|
|
160
|
+
this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
|
|
161
|
+
for bound_atoms in this_atoms_neighbors:
|
|
162
|
+
if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
|
|
163
|
+
new_active_set.add(bound_atoms)
|
|
164
|
+
# print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
|
|
165
|
+
for inds in new_active_set:
|
|
166
|
+
result_vector[hopped] += prop_vec_num[orig] / prop_vec_den[inds]
|
|
167
|
+
historical_set.update(active_set)
|
|
168
|
+
active_set = new_active_set
|
|
169
|
+
return (result_vector)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def summetric(mol, prop_vec, orig, d, oct=True, catoms=None):
|
|
173
|
+
"""This function returns the summetrics for one atom
|
|
174
|
+
|
|
175
|
+
Parameters
|
|
176
|
+
----------
|
|
177
|
+
mol : mol3D class
|
|
178
|
+
prop_vec : vector, property of atoms in mol in order of index
|
|
179
|
+
orig : int, zero-indexed starting atom
|
|
180
|
+
d : int, number of hops to travel
|
|
181
|
+
oct : bool, if complex is octahedral, will use better bond checks
|
|
182
|
+
|
|
183
|
+
Returns
|
|
184
|
+
-------
|
|
185
|
+
result_vector : vector of prop_vec_num / prop_vec_den
|
|
186
|
+
|
|
187
|
+
"""
|
|
188
|
+
result_vector = np.zeros(d + 1)
|
|
189
|
+
hopped = 0
|
|
190
|
+
active_set = set([orig])
|
|
191
|
+
historical_set = set()
|
|
192
|
+
result_vector[hopped] = prop_vec[orig] + prop_vec[orig]
|
|
193
|
+
"""
|
|
194
|
+
if oct:
|
|
195
|
+
print('using OCT autocorrelation')
|
|
196
|
+
else:
|
|
197
|
+
print('NOT using OCT autocorrelation')
|
|
198
|
+
"""
|
|
199
|
+
while hopped < (d):
|
|
200
|
+
|
|
201
|
+
hopped += 1
|
|
202
|
+
new_active_set = set()
|
|
203
|
+
for this_atom in active_set:
|
|
204
|
+
# prepare all atoms attached to this connection
|
|
205
|
+
# print('called in AC')
|
|
206
|
+
this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
|
|
207
|
+
for bound_atoms in this_atoms_neighbors:
|
|
208
|
+
if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
|
|
209
|
+
new_active_set.add(bound_atoms)
|
|
210
|
+
# print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
|
|
211
|
+
for inds in new_active_set:
|
|
212
|
+
result_vector[hopped] += prop_vec[orig] + prop_vec[inds]
|
|
213
|
+
historical_set.update(active_set)
|
|
214
|
+
active_set = new_active_set
|
|
215
|
+
return (result_vector)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def deltametric(mol: mol3D, prop_vec, orig, d: int, oct=True, catoms=None):
|
|
219
|
+
# # this function returns the deltametric
|
|
220
|
+
# # over the whole molecule
|
|
221
|
+
# Inputs:
|
|
222
|
+
# mol - mol3D class
|
|
223
|
+
# prop_vec - vector, property of atoms in mol in order of index
|
|
224
|
+
# orig - int, zero-indexed starting atom
|
|
225
|
+
# d - int, number of hops to travel
|
|
226
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
227
|
+
# if oct:
|
|
228
|
+
# print('using OCT delta autocorrelation')
|
|
229
|
+
# else:
|
|
230
|
+
# print('NOT using OCT delta autocorrelation')
|
|
231
|
+
result_vector = np.zeros(d + 1)
|
|
232
|
+
hopped = 0
|
|
233
|
+
active_set = set([orig])
|
|
234
|
+
historical_set = set()
|
|
235
|
+
result_vector[hopped] = 0.00
|
|
236
|
+
while hopped < (d):
|
|
237
|
+
hopped += 1
|
|
238
|
+
new_active_set = set()
|
|
239
|
+
for this_atom in active_set:
|
|
240
|
+
# prepare all atoms attached to this connection
|
|
241
|
+
# print('called in DAC')
|
|
242
|
+
this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
|
|
243
|
+
for bound_atoms in this_atoms_neighbors:
|
|
244
|
+
if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
|
|
245
|
+
new_active_set.add(bound_atoms)
|
|
246
|
+
# print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
|
|
247
|
+
for inds in new_active_set:
|
|
248
|
+
result_vector[hopped] += prop_vec[orig] - prop_vec[inds]
|
|
249
|
+
historical_set.update(active_set)
|
|
250
|
+
active_set = new_active_set
|
|
251
|
+
return (result_vector)
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def autocorrelation_catoms(mol, prop_vec, orig, d, oct=True, catoms=None):
|
|
255
|
+
# Calculate the autocorrelation for the orig to certain connecting atoms.
|
|
256
|
+
result_vector = np.zeros(d + 1)
|
|
257
|
+
hopped = 0
|
|
258
|
+
active_set = set([orig])
|
|
259
|
+
historical_set = set()
|
|
260
|
+
result_vector[hopped] = prop_vec[orig] * prop_vec[orig]
|
|
261
|
+
# if oct:
|
|
262
|
+
# print('using OCT autocorrelation')
|
|
263
|
+
# else:
|
|
264
|
+
# print('NOT using OCT autocorrelation')
|
|
265
|
+
while hopped < (d):
|
|
266
|
+
|
|
267
|
+
hopped += 1
|
|
268
|
+
new_active_set = set()
|
|
269
|
+
for this_atom in active_set:
|
|
270
|
+
# prepare all atoms attached to this connection
|
|
271
|
+
# print('called in AC')
|
|
272
|
+
this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
|
|
273
|
+
# print('--1--:', this_atoms_neighbors)
|
|
274
|
+
if this_atom == orig and (catoms is not None):
|
|
275
|
+
this_atoms_neighbors = catoms
|
|
276
|
+
# print('--2--:', this_atoms_neighbors)
|
|
277
|
+
for bound_atoms in this_atoms_neighbors:
|
|
278
|
+
if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
|
|
279
|
+
new_active_set.add(bound_atoms)
|
|
280
|
+
# print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
|
|
281
|
+
for inds in new_active_set:
|
|
282
|
+
result_vector[hopped] += prop_vec[orig] * prop_vec[inds]
|
|
283
|
+
historical_set.update(active_set)
|
|
284
|
+
active_set = new_active_set
|
|
285
|
+
return (result_vector)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def deltametric_derivative(mol, prop_vec, orig, d, oct=True, catoms=None):
|
|
289
|
+
# # this function returns the derivative vector
|
|
290
|
+
# # of the scalar autocorrelation
|
|
291
|
+
# # starting at orig with depth d,
|
|
292
|
+
# # with respect to the atomic properties
|
|
293
|
+
# # in prop_vec, for all atoms.
|
|
294
|
+
# # The return type is np.array for
|
|
295
|
+
# # Be sure to read this carefully!
|
|
296
|
+
# Inputs:
|
|
297
|
+
# mol - mol3D class
|
|
298
|
+
# prop_vec - vector, property of atoms in mol in order of index
|
|
299
|
+
# orig - int, zero-indexed starting atom
|
|
300
|
+
# d - int, number of hops to travel
|
|
301
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
302
|
+
# if oct:
|
|
303
|
+
# print('using OCT delta autocorrelation')
|
|
304
|
+
# else:
|
|
305
|
+
# print('NOT using OCT delta autocorrelation')
|
|
306
|
+
|
|
307
|
+
derivative_mat = np.zeros((d + 1, len(prop_vec)))
|
|
308
|
+
|
|
309
|
+
hopped = 0
|
|
310
|
+
active_set = set([orig])
|
|
311
|
+
historical_set = set()
|
|
312
|
+
|
|
313
|
+
# the zero-depth element is always zero
|
|
314
|
+
for derivate_ind in range(0, len(prop_vec)):
|
|
315
|
+
derivative_mat[hopped, derivate_ind] = 0.0
|
|
316
|
+
|
|
317
|
+
while hopped < (d):
|
|
318
|
+
hopped += 1
|
|
319
|
+
new_active_set = set()
|
|
320
|
+
for this_atom in active_set:
|
|
321
|
+
# prepare all atoms attached to this connection
|
|
322
|
+
# print('called in DAC')
|
|
323
|
+
this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
|
|
324
|
+
for bound_atoms in this_atoms_neighbors:
|
|
325
|
+
if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
|
|
326
|
+
new_active_set.add(bound_atoms)
|
|
327
|
+
# print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
|
|
328
|
+
for inds in new_active_set:
|
|
329
|
+
|
|
330
|
+
for derivate_ind in range(0, len(prop_vec)):
|
|
331
|
+
if derivate_ind == orig:
|
|
332
|
+
derivative_mat[hopped, derivate_ind] += 1
|
|
333
|
+
elif derivate_ind == inds:
|
|
334
|
+
derivative_mat[hopped, derivate_ind] += -1
|
|
335
|
+
|
|
336
|
+
historical_set.update(active_set)
|
|
337
|
+
active_set = new_active_set
|
|
338
|
+
return (derivative_mat)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def deltametric_catoms(mol, prop_vec, orig, d, oct=True, catoms=None):
|
|
342
|
+
# Calculate the deltametrics for the orig to certain connecting atoms.
|
|
343
|
+
result_vector = np.zeros(d + 1)
|
|
344
|
+
hopped = 0
|
|
345
|
+
active_set = set([orig])
|
|
346
|
+
historical_set = set()
|
|
347
|
+
result_vector[hopped] = 0.00
|
|
348
|
+
# metal_idx = mol.findMetal()[0]
|
|
349
|
+
while hopped < (d):
|
|
350
|
+
hopped += 1
|
|
351
|
+
new_active_set = set()
|
|
352
|
+
for this_atom in active_set:
|
|
353
|
+
# prepare all atoms attached to this connection
|
|
354
|
+
# print('called in DAC')
|
|
355
|
+
this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
|
|
356
|
+
# print('--1--:', this_atoms_neighbors)
|
|
357
|
+
if this_atom == orig and (catoms is not None):
|
|
358
|
+
this_atoms_neighbors = catoms
|
|
359
|
+
# print('--2--:', this_atoms_neighbors)
|
|
360
|
+
for bound_atoms in this_atoms_neighbors:
|
|
361
|
+
if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
|
|
362
|
+
new_active_set.add(bound_atoms)
|
|
363
|
+
# print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
|
|
364
|
+
for inds in new_active_set:
|
|
365
|
+
result_vector[hopped] += prop_vec[orig] - prop_vec[inds]
|
|
366
|
+
historical_set.update(active_set)
|
|
367
|
+
active_set = new_active_set
|
|
368
|
+
return (result_vector)
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def full_autocorrelation(mol, prop, d, oct=oct, modifier=False, use_dist=False, transition_metals_only=True):
|
|
372
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier, transition_metals_only=transition_metals_only)
|
|
373
|
+
index_set = list(range(0, mol.natoms))
|
|
374
|
+
autocorrelation_vector = np.zeros(d + 1)
|
|
375
|
+
for centers in index_set:
|
|
376
|
+
autocorrelation_vector += autocorrelation(mol, w, centers, d, oct=oct, use_dist=use_dist)
|
|
377
|
+
return (autocorrelation_vector)
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def full_autocorrelation_derivative(mol, prop, d, oct=oct, modifier=False):
|
|
381
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
382
|
+
index_set = list(range(0, mol.natoms))
|
|
383
|
+
autocorrelation_derivative_mat = np.zeros((d + 1, mol.natoms))
|
|
384
|
+
for centers in index_set:
|
|
385
|
+
autocorrelation_derivative_mat += autocorrelation_derivative(mol, w, centers, d, oct=oct)
|
|
386
|
+
return (autocorrelation_derivative_mat)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
def atom_only_autocorrelation(mol, prop, d, atomIdx, oct=True):
|
|
390
|
+
# atomIdx must be either a list of indicies
|
|
391
|
+
# or a single index
|
|
392
|
+
w = construct_property_vector(mol, prop, oct)
|
|
393
|
+
autocorrelation_vector = np.zeros(d + 1)
|
|
394
|
+
if hasattr(atomIdx, "__len__"): # Indicative of a list of indices
|
|
395
|
+
for elements in atomIdx:
|
|
396
|
+
autocorrelation_vector += autocorrelation(mol, w, elements, d, oct=oct)
|
|
397
|
+
autocorrelation_vector = np.divide(autocorrelation_vector, len(atomIdx)) # averaging
|
|
398
|
+
else: # Single index
|
|
399
|
+
autocorrelation_vector += autocorrelation(mol, w, atomIdx, d, oct=oct)
|
|
400
|
+
return (autocorrelation_vector)
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
def atom_only_autocorrelation_derivative(mol, prop, d, atomIdx, oct=True):
|
|
404
|
+
# atomIdx must b either a list of indicies
|
|
405
|
+
# or a single index
|
|
406
|
+
w = construct_property_vector(mol, prop, oct)
|
|
407
|
+
autocorrelation_derivative_mat = np.zeros((d + 1, mol.natoms))
|
|
408
|
+
if hasattr(atomIdx, "__len__"):
|
|
409
|
+
for elements in atomIdx:
|
|
410
|
+
autocorrelation_derivative_mat += autocorrelation_derivative(mol, w, elements, d, oct=oct)
|
|
411
|
+
autocorrelation_derivative_mat = np.divide(autocorrelation_derivative_mat, len(atomIdx))
|
|
412
|
+
else:
|
|
413
|
+
autocorrelation_derivative_mat += autocorrelation_derivative(mol, w, atomIdx, d, oct=oct)
|
|
414
|
+
return (autocorrelation_derivative_mat)
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
def metal_only_autocorrelation(mol, prop, d, oct=True, catoms=None,
|
|
418
|
+
func=autocorrelation, modifier=False):
|
|
419
|
+
try:
|
|
420
|
+
metal_ind = mol.findMetal()[0]
|
|
421
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
422
|
+
autocorrelation_vector = func(mol, w, metal_ind, d, oct=oct,
|
|
423
|
+
catoms=catoms)
|
|
424
|
+
except IndexError:
|
|
425
|
+
print('Error, no metal found in mol object!')
|
|
426
|
+
return False
|
|
427
|
+
return (autocorrelation_vector)
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
def metal_only_autocorrelation_derivative(mol, prop, d, oct=True, catoms=None,
|
|
431
|
+
func=autocorrelation_derivative, modifier=False):
|
|
432
|
+
try:
|
|
433
|
+
metal_ind = mol.findMetal()[0]
|
|
434
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
435
|
+
autocorrelation_vector_derivative = func(mol, w, metal_ind, d, oct=oct,
|
|
436
|
+
catoms=catoms)
|
|
437
|
+
except IndexError:
|
|
438
|
+
print('Error, no metal found in mol object!')
|
|
439
|
+
return False
|
|
440
|
+
return (autocorrelation_vector_derivative)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
def multimetal_only_autocorrelation(mol, prop, d, oct=True, catoms=None,
|
|
444
|
+
func=autocorrelation, modifier=False):
|
|
445
|
+
autocorrelation_vector = np.zeros(d + 1)
|
|
446
|
+
n_met = len(mol.findMetal())
|
|
447
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
448
|
+
for metal_ind in mol.findMetal():
|
|
449
|
+
autocorrelation_vector += func(mol, w, metal_ind, d, oct=oct, catoms=catoms)
|
|
450
|
+
autocorrelation_vector = np.divide(autocorrelation_vector, n_met)
|
|
451
|
+
return (autocorrelation_vector)
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
def multiatom_only_autocorrelation(mol, prop, d, oct=True, catoms=None,
|
|
455
|
+
func=autocorrelation, modifier=False,
|
|
456
|
+
additional_elements=False):
|
|
457
|
+
autocorrelation_vector = np.zeros(d + 1)
|
|
458
|
+
metal_list = mol.findMetal()
|
|
459
|
+
if additional_elements:
|
|
460
|
+
for element in additional_elements:
|
|
461
|
+
metal_list += mol.findAtomsbySymbol(element)
|
|
462
|
+
n_met = len(metal_list)
|
|
463
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
464
|
+
for metal_ind in metal_list:
|
|
465
|
+
autocorrelation_vector += func(mol, w, metal_ind, d, oct=oct, catoms=catoms)
|
|
466
|
+
autocorrelation_vector = np.divide(autocorrelation_vector, n_met)
|
|
467
|
+
return (autocorrelation_vector)
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
def atom_only_ratiometric(mol, prop_num, prop_den, d, atomIdx, oct=True):
|
|
471
|
+
# atomIdx must b either a list of indicies
|
|
472
|
+
# or a single index
|
|
473
|
+
w_num = construct_property_vector(mol, prop_num, oct)
|
|
474
|
+
w_den = construct_property_vector(mol, prop_den, oct)
|
|
475
|
+
autocorrelation_vector = np.zeros(d + 1)
|
|
476
|
+
if hasattr(atomIdx, "__len__"):
|
|
477
|
+
for elements in atomIdx:
|
|
478
|
+
autocorrelation_vector += ratiometric(mol, w_num, w_den, elements, d, oct=oct)
|
|
479
|
+
autocorrelation_vector = np.divide(autocorrelation_vector, len(atomIdx))
|
|
480
|
+
else:
|
|
481
|
+
autocorrelation_vector += ratiometric(mol, w_num, w_den, atomIdx, d, oct=oct)
|
|
482
|
+
return (autocorrelation_vector)
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
def atom_only_summetric(mol, prop, d, atomIdx, oct=True):
|
|
486
|
+
# atomIdx must b either a list of indicies
|
|
487
|
+
# or a single index
|
|
488
|
+
w = construct_property_vector(mol, prop, oct)
|
|
489
|
+
autocorrelation_vector = np.zeros(d + 1)
|
|
490
|
+
if hasattr(atomIdx, "__len__"):
|
|
491
|
+
for elements in atomIdx:
|
|
492
|
+
autocorrelation_vector += summetric(mol, w, elements, d, oct=oct)
|
|
493
|
+
autocorrelation_vector = np.divide(autocorrelation_vector, len(atomIdx))
|
|
494
|
+
else:
|
|
495
|
+
autocorrelation_vector += summetric(mol, w, atomIdx, d, oct=oct)
|
|
496
|
+
return (autocorrelation_vector)
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
def atom_only_deltametric(mol, prop, d, atomIdx, oct=True, modifier=False):
|
|
500
|
+
# atomIdx must b either a list of indicies
|
|
501
|
+
# or a single index
|
|
502
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
503
|
+
|
|
504
|
+
deltametric_vector = np.zeros(d + 1)
|
|
505
|
+
if hasattr(atomIdx, "__len__"):
|
|
506
|
+
for elements in atomIdx:
|
|
507
|
+
deltametric_vector += deltametric(mol, w, elements, d, oct=oct)
|
|
508
|
+
deltametric_vector = np.divide(deltametric_vector, len(atomIdx))
|
|
509
|
+
else:
|
|
510
|
+
deltametric_vector += deltametric(mol, w, atomIdx, d, oct=oct)
|
|
511
|
+
return (deltametric_vector)
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
def atom_only_deltametric_derivative(mol, prop, d, atomIdx, oct=True, modifier=False):
|
|
515
|
+
# atomIdx must b either a list of indicies
|
|
516
|
+
# or a single index
|
|
517
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
518
|
+
|
|
519
|
+
deltametric_derivative_mat = np.zeros((d + 1, mol.natoms))
|
|
520
|
+
if hasattr(atomIdx, "__len__"):
|
|
521
|
+
for elements in atomIdx:
|
|
522
|
+
deltametric_derivative_mat += deltametric_derivative(mol, w, elements, d, oct=oct)
|
|
523
|
+
deltametric_derivative_mat = np.divide(deltametric_derivative_mat, len(atomIdx))
|
|
524
|
+
else:
|
|
525
|
+
|
|
526
|
+
deltametric_derivative_mat += deltametric_derivative(mol, w, atomIdx, d, oct=oct)
|
|
527
|
+
return (deltametric_derivative_mat)
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
def metal_only_deltametric_derivative(mol, prop, d, oct=True, catoms=None,
|
|
531
|
+
func=deltametric_derivative, modifier=False):
|
|
532
|
+
try:
|
|
533
|
+
metal_ind = mol.findMetal()[0]
|
|
534
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
535
|
+
deltametric_vector_derivative = func(mol, w, metal_ind, d, oct=oct,
|
|
536
|
+
catoms=catoms)
|
|
537
|
+
except IndexError:
|
|
538
|
+
print('Error, no metal found in mol object!')
|
|
539
|
+
return False
|
|
540
|
+
return (deltametric_vector_derivative)
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
def metal_only_deltametric(mol, prop, d, oct=True, catoms=None,
|
|
544
|
+
func=deltametric, modifier=False):
|
|
545
|
+
try:
|
|
546
|
+
metal_ind = mol.findMetal()[0]
|
|
547
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
548
|
+
deltametric_vector = func(mol, w, metal_ind, d, oct=oct,
|
|
549
|
+
catoms=catoms)
|
|
550
|
+
except IndexError:
|
|
551
|
+
print('Error, no metal found in mol object!')
|
|
552
|
+
return False
|
|
553
|
+
return (deltametric_vector)
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
def multimetal_only_deltametric(mol, prop, d, oct=True, catoms=None,
|
|
557
|
+
func=deltametric, modifier=False):
|
|
558
|
+
deltametric_vector = np.zeros(d + 1)
|
|
559
|
+
n_met = len(mol.findMetal())
|
|
560
|
+
|
|
561
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
562
|
+
for metal_ind in mol.findMetal():
|
|
563
|
+
deltametric_vector += func(mol, w, metal_ind, d, oct=oct,
|
|
564
|
+
catoms=catoms)
|
|
565
|
+
deltametric_vector = np.divide(deltametric_vector, n_met)
|
|
566
|
+
return (deltametric_vector)
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
def multiatom_only_deltametric(mol, prop, d, oct=True, catoms=None,
|
|
570
|
+
func=deltametric, modifier=False,
|
|
571
|
+
additional_elements=False):
|
|
572
|
+
deltametric_vector = np.zeros(d + 1)
|
|
573
|
+
metal_list = mol.findMetal()
|
|
574
|
+
if additional_elements:
|
|
575
|
+
for element in additional_elements:
|
|
576
|
+
metal_list += mol.findAtomsbySymbol(element)
|
|
577
|
+
n_met = len(metal_list)
|
|
578
|
+
w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
|
|
579
|
+
for metal_ind in mol.findMetal():
|
|
580
|
+
deltametric_vector += func(mol, w, metal_ind, d, oct=oct,
|
|
581
|
+
catoms=catoms)
|
|
582
|
+
deltametric_vector = np.divide(deltametric_vector, n_met)
|
|
583
|
+
return (deltametric_vector)
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
def metal_only_layer_density(mol, prop, d, oct=True):
|
|
587
|
+
try:
|
|
588
|
+
metal_ind = mol.findMetal()[0]
|
|
589
|
+
print(('metal_index is: %d' % metal_ind))
|
|
590
|
+
w = construct_property_vector(mol, prop, oct=oct)
|
|
591
|
+
density_vector = layer_density_in_3D(mol, w, metal_ind, d, oct=oct)
|
|
592
|
+
except IndexError:
|
|
593
|
+
print('Error, no metal found in mol object!')
|
|
594
|
+
return False
|
|
595
|
+
return density_vector
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
def layer_density_in_3D(mol, prop_vec, orig, d, oct=True):
|
|
599
|
+
# # this function returns the density (prop^3/(d+1)^3)
|
|
600
|
+
# # for one atom
|
|
601
|
+
# Inputs:
|
|
602
|
+
# mol - mol3D class
|
|
603
|
+
# prop_vec - vector, property of atoms in mol in order of index
|
|
604
|
+
# orig - int, zero-indexed starting atom
|
|
605
|
+
# d - int, number of hops to travel
|
|
606
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
607
|
+
result_vector = np.zeros(d + 1)
|
|
608
|
+
hopped = 0
|
|
609
|
+
active_set = set([orig])
|
|
610
|
+
historical_set = set()
|
|
611
|
+
result_vector[hopped] = prop_vec[orig] ** 3 / (hopped + 1) ** 3
|
|
612
|
+
# if oct:
|
|
613
|
+
# print('using OCT autocorrelation')
|
|
614
|
+
# else:
|
|
615
|
+
# print('NOT using OCT autocorrelation')
|
|
616
|
+
while hopped < (d):
|
|
617
|
+
|
|
618
|
+
hopped += 1
|
|
619
|
+
new_active_set = set()
|
|
620
|
+
for this_atom in active_set:
|
|
621
|
+
# prepare all atoms attached to this connection
|
|
622
|
+
# print('called in AC')
|
|
623
|
+
this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
|
|
624
|
+
for bound_atoms in this_atoms_neighbors:
|
|
625
|
+
if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
|
|
626
|
+
new_active_set.add(bound_atoms)
|
|
627
|
+
# print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
|
|
628
|
+
for inds in new_active_set:
|
|
629
|
+
result_vector[hopped] += prop_vec[inds] ** 3 / (hopped + 1) ** 3
|
|
630
|
+
historical_set.update(active_set)
|
|
631
|
+
active_set = new_active_set
|
|
632
|
+
return result_vector
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
def construct_property_vector(mol: mol3D, prop: str, oct=True, modifier=False, transition_metals_only=True):
|
|
636
|
+
# # assigns the value of property
|
|
637
|
+
# # for atom i (zero index) in mol
|
|
638
|
+
# # to position i in returned vector
|
|
639
|
+
# # can be used to create weighted
|
|
640
|
+
# # graph representations
|
|
641
|
+
# # oct - bool, if complex is octahedral, will use better bond checks
|
|
642
|
+
# # modifier - dict, used to modify prop vector (e.g. for adding
|
|
643
|
+
# # ONLY used with ox_nuclear_charge ox or charge)
|
|
644
|
+
# # {"Fe":2, "Co": 3} etc
|
|
645
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology',
|
|
646
|
+
'ox_nuclear_charge', 'size', 'vdwrad', 'group_number', 'polarizability',
|
|
647
|
+
'bondvalence', 'num_bonds', 'bondvalence_devi', 'bodavrg', 'bodstd', 'charge']
|
|
648
|
+
# # note that ident just codes every atom as one, this gives
|
|
649
|
+
# # a purely toplogical index. coord gives the number of
|
|
650
|
+
# # connecting atom to attom i (similar to Randic index)
|
|
651
|
+
# if not oct:
|
|
652
|
+
# print('NOT using octahedral bonding pattern')
|
|
653
|
+
globs = globalvars()
|
|
654
|
+
prop_dict = dict()
|
|
655
|
+
w = np.zeros(mol.natoms)
|
|
656
|
+
done = False
|
|
657
|
+
if prop not in allowed_strings:
|
|
658
|
+
print(('error, property ' + str(prop) + ' is not a vaild choice'))
|
|
659
|
+
print((' options are ' + str(allowed_strings)))
|
|
660
|
+
return False
|
|
661
|
+
if prop == 'electronegativity':
|
|
662
|
+
prop_dict = globs.endict()
|
|
663
|
+
elif prop == 'size':
|
|
664
|
+
at_keys = list(globs.amass().keys())
|
|
665
|
+
for keys in at_keys:
|
|
666
|
+
values = globs.amass()[keys][2]
|
|
667
|
+
prop_dict.update({keys: values})
|
|
668
|
+
elif prop == 'nuclear_charge':
|
|
669
|
+
at_keys = list(globs.amass().keys())
|
|
670
|
+
for keys in at_keys:
|
|
671
|
+
values = globs.amass()[keys][1]
|
|
672
|
+
prop_dict.update({keys: values})
|
|
673
|
+
elif prop == 'group_number': # Uses number of valence electrons
|
|
674
|
+
# if not modifier:
|
|
675
|
+
at_keys = list(globs.amass().keys())
|
|
676
|
+
for keys in at_keys:
|
|
677
|
+
values = globs.amass()[keys][-1]
|
|
678
|
+
prop_dict.update({keys: values})
|
|
679
|
+
# ###### 11/06/2019 -- Adjusted Gval RACs to not adjust on oxidation state. Confounded with O RACs. #####
|
|
680
|
+
# # else:
|
|
681
|
+
# at_keys = globs.amass().keys()
|
|
682
|
+
# for keys in at_keys:
|
|
683
|
+
# values = globs.amass()[keys][3]
|
|
684
|
+
# if keys in modifier.keys():
|
|
685
|
+
# values -= float(modifier[keys]) # assumes oxidation state provided (i.e. Fe(IV))
|
|
686
|
+
# prop_dict.update({keys: values})
|
|
687
|
+
elif prop == 'ox_nuclear_charge':
|
|
688
|
+
if not modifier:
|
|
689
|
+
print('Error, must give modifier with ox_nuclear_charge')
|
|
690
|
+
return False
|
|
691
|
+
else:
|
|
692
|
+
at_keys = list(globs.amass().keys())
|
|
693
|
+
for keys in at_keys:
|
|
694
|
+
values = globs.amass()[keys][1]
|
|
695
|
+
if keys in list(modifier.keys()):
|
|
696
|
+
values -= float(modifier[keys]) # assumes oxidation state provided (i.e. Fe(IV))
|
|
697
|
+
prop_dict.update({keys: values})
|
|
698
|
+
elif prop == 'polarizability':
|
|
699
|
+
prop_dict = globs.polarizability()
|
|
700
|
+
for i, atoms in enumerate(mol.getAtoms()):
|
|
701
|
+
atom_type = atoms.symbol()
|
|
702
|
+
w[i] = prop_dict[atom_type]
|
|
703
|
+
elif prop == 'ident':
|
|
704
|
+
at_keys = list(globs.amass().keys())
|
|
705
|
+
for keys in at_keys:
|
|
706
|
+
prop_dict.update({keys: 1})
|
|
707
|
+
elif prop == 'topology':
|
|
708
|
+
for i, atoms in enumerate(mol.getAtoms()):
|
|
709
|
+
# print('atom # ' + str(i) + " symbol = " + str(atoms.symbol()))
|
|
710
|
+
w[i] = len(mol.getBondedAtomsSmart(i, oct=oct))
|
|
711
|
+
done = True
|
|
712
|
+
elif prop == 'vdwrad':
|
|
713
|
+
prop_dict = globs.vdwrad()
|
|
714
|
+
for i, atoms in enumerate(mol.getAtoms()):
|
|
715
|
+
atom_type = atoms.symbol()
|
|
716
|
+
if atom_type in globs.metalslist():
|
|
717
|
+
w[i] = globs.amass()[atoms.symbol()][2]
|
|
718
|
+
else:
|
|
719
|
+
w[i] = prop_dict[atoms.symbol()]
|
|
720
|
+
done = True
|
|
721
|
+
# for keys in at_keys:
|
|
722
|
+
# prop_dict.update({keys: 1})
|
|
723
|
+
elif prop == 'bondvalence':
|
|
724
|
+
assert len(mol.getAtoms()) == len(mol.bv_dict)
|
|
725
|
+
for i, atoms in enumerate(mol.getAtoms()):
|
|
726
|
+
w[i] = mol.bv_dict[i]
|
|
727
|
+
done = True
|
|
728
|
+
elif prop == 'num_bonds':
|
|
729
|
+
for i, atom in enumerate(mol.getAtoms()):
|
|
730
|
+
if not atom.ismetal(transition_metals_only):
|
|
731
|
+
w[i] = globs.bondsdict()[atom.symbol()]
|
|
732
|
+
else:
|
|
733
|
+
w[i] = len(mol.getBondedAtomsSmart(i, oct=oct))
|
|
734
|
+
done = True
|
|
735
|
+
elif prop == 'bondvalence_devi':
|
|
736
|
+
assert len(mol.getAtoms()) == len(mol.bvd_dict)
|
|
737
|
+
for i, atoms in enumerate(mol.getAtoms()):
|
|
738
|
+
w[i] = mol.bvd_dict[i]
|
|
739
|
+
done = True
|
|
740
|
+
elif prop == 'bodavrg':
|
|
741
|
+
assert len(mol.getAtoms()) == len(mol.bodavrg_dict)
|
|
742
|
+
for i, atoms in enumerate(mol.getAtoms()):
|
|
743
|
+
w[i] = mol.bodavrg_dict[i]
|
|
744
|
+
done = True
|
|
745
|
+
elif prop == 'bodstd':
|
|
746
|
+
assert len(mol.getAtoms()) == len(mol.bodstd_dict)
|
|
747
|
+
for i, atoms in enumerate(mol.getAtoms()):
|
|
748
|
+
w[i] = mol.bodstd_dict[i]
|
|
749
|
+
done = True
|
|
750
|
+
elif prop == 'charge':
|
|
751
|
+
assert len(mol.getAtoms()) == len(mol.charge_dict)
|
|
752
|
+
for i, atoms in enumerate(mol.getAtoms()):
|
|
753
|
+
w[i] = mol.charge_dict[i]
|
|
754
|
+
done = True
|
|
755
|
+
if not done:
|
|
756
|
+
for i, atoms in enumerate(mol.getAtoms()):
|
|
757
|
+
# print('atom # ' + str(i) + " symbol = " + str(atoms.symbol()))
|
|
758
|
+
w[i] = prop_dict[atoms.symbol()]
|
|
759
|
+
return (w)
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
def find_ligand_autocorrelations_oct(mol, prop, loud, depth, name=False,
|
|
763
|
+
oct=True, custom_ligand_dict=False):
|
|
764
|
+
# # this function takes a
|
|
765
|
+
# # symmetric (axial == axial,
|
|
766
|
+
# # equatorial == equatorial)
|
|
767
|
+
# # octahedral complex
|
|
768
|
+
# # and returns autocorrelations for
|
|
769
|
+
# # the axial an equatorial ligands
|
|
770
|
+
# # custom_ligand_dict allows the user to skip the breakdown
|
|
771
|
+
# # in cases where 3D geo is not correct/formed
|
|
772
|
+
# # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
|
|
773
|
+
# # ax_con_int_list ,eq_con_int_list
|
|
774
|
+
# # with types: eq/ax_ligand_list list of mol3D
|
|
775
|
+
# # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
|
|
776
|
+
if not custom_ligand_dict:
|
|
777
|
+
liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
|
|
778
|
+
(ax_ligand_list, eq_ligand_list, ax_natoms_list,
|
|
779
|
+
eq_natoms_list, ax_con_int_list, eq_con_int_list,
|
|
780
|
+
ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
|
|
781
|
+
mol, liglist, ligdents, ligcons, loud, name=False)
|
|
782
|
+
else:
|
|
783
|
+
ax_ligand_list = custom_ligand_dict["ax_ligand_list"]
|
|
784
|
+
eq_ligand_list = custom_ligand_dict["eq_ligand_list"]
|
|
785
|
+
ax_con_int_list = custom_ligand_dict["ax_con_int_list"]
|
|
786
|
+
eq_con_int_list = custom_ligand_dict["eq_con_int_list"]
|
|
787
|
+
# count ligands
|
|
788
|
+
n_ax = len(ax_ligand_list)
|
|
789
|
+
n_eq = len(eq_ligand_list)
|
|
790
|
+
# get full ligand AC
|
|
791
|
+
ax_ligand_ac_full = []
|
|
792
|
+
eq_ligand_ac_full = []
|
|
793
|
+
for i in range(0, n_ax):
|
|
794
|
+
if not list(ax_ligand_ac_full):
|
|
795
|
+
ax_ligand_ac_full = full_autocorrelation(ax_ligand_list[i].mol, prop, depth)
|
|
796
|
+
else:
|
|
797
|
+
ax_ligand_ac_full += full_autocorrelation(ax_ligand_list[i].mol, prop, depth)
|
|
798
|
+
ax_ligand_ac_full = np.divide(ax_ligand_ac_full, n_ax)
|
|
799
|
+
for i in range(0, n_eq):
|
|
800
|
+
if not list(eq_ligand_ac_full):
|
|
801
|
+
eq_ligand_ac_full = full_autocorrelation(eq_ligand_list[i].mol, prop, depth)
|
|
802
|
+
else:
|
|
803
|
+
eq_ligand_ac_full += full_autocorrelation(eq_ligand_list[i].mol, prop, depth)
|
|
804
|
+
eq_ligand_ac_full = np.divide(eq_ligand_ac_full, n_eq)
|
|
805
|
+
|
|
806
|
+
# get partial ligand AC
|
|
807
|
+
ax_ligand_ac_con = []
|
|
808
|
+
eq_ligand_ac_con = []
|
|
809
|
+
|
|
810
|
+
for i in range(0, n_ax):
|
|
811
|
+
if not list(ax_ligand_ac_con):
|
|
812
|
+
ax_ligand_ac_con = atom_only_autocorrelation(ax_ligand_list[i].mol, prop, depth, ax_con_int_list[i])
|
|
813
|
+
else:
|
|
814
|
+
ax_ligand_ac_con += atom_only_autocorrelation(ax_ligand_list[i].mol, prop, depth, ax_con_int_list[i])
|
|
815
|
+
ax_ligand_ac_con = np.divide(ax_ligand_ac_con, n_ax)
|
|
816
|
+
for i in range(0, n_eq):
|
|
817
|
+
if not list(eq_ligand_ac_con):
|
|
818
|
+
eq_ligand_ac_con = atom_only_autocorrelation(eq_ligand_list[i].mol, prop, depth, eq_con_int_list[i])
|
|
819
|
+
else:
|
|
820
|
+
eq_ligand_ac_con += atom_only_autocorrelation(eq_ligand_list[i].mol, prop, depth, eq_con_int_list[i])
|
|
821
|
+
eq_ligand_ac_con = np.divide(eq_ligand_ac_con, n_eq)
|
|
822
|
+
|
|
823
|
+
# ax_ligand_ac_con = atom_only_autocorrelation(ax_ligand.mol,prop,depth,ax_con_int)
|
|
824
|
+
# eq_ligand_ac_con = atom_only_autocorrelation(eq_ligand.mol,prop,depth,eq_con_int)
|
|
825
|
+
return ax_ligand_ac_full, eq_ligand_ac_full, ax_ligand_ac_con, eq_ligand_ac_con
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
def find_ligand_autocorrelation_derivatives_oct(mol, prop, loud, depth, name=False,
|
|
829
|
+
oct=True, custom_ligand_dict=False):
|
|
830
|
+
# # this function takes a
|
|
831
|
+
# # symmetric (axial == axial,
|
|
832
|
+
# # equatorial == equatorial)
|
|
833
|
+
# # octahedral complex
|
|
834
|
+
# # and returns autocorrelations for
|
|
835
|
+
# # the axial an equatorial ligands
|
|
836
|
+
# # custom_ligand_dict allows the user to skip the breakdown
|
|
837
|
+
# # in cases where 3D geo is not correct/formed
|
|
838
|
+
# # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
|
|
839
|
+
# # ax_con_int_list ,eq_con_int_list
|
|
840
|
+
# # with types: eq/ax_ligand_list list of mol3D
|
|
841
|
+
# # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
|
|
842
|
+
if not custom_ligand_dict:
|
|
843
|
+
liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
|
|
844
|
+
(ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list,
|
|
845
|
+
eq_con_int_list, ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
|
|
846
|
+
mol, liglist, ligdents, ligcons, loud, name=False)
|
|
847
|
+
else:
|
|
848
|
+
ax_ligand_list = custom_ligand_dict["ax_ligand_list"]
|
|
849
|
+
eq_ligand_list = custom_ligand_dict["eq_ligand_list"]
|
|
850
|
+
ax_con_int_list = custom_ligand_dict["ax_con_int_list"]
|
|
851
|
+
eq_con_int_list = custom_ligand_dict["eq_con_int_list"]
|
|
852
|
+
# count ligands
|
|
853
|
+
n_ax = len(ax_ligand_list)
|
|
854
|
+
n_eq = len(eq_ligand_list)
|
|
855
|
+
# get full ligand AC
|
|
856
|
+
ax_ligand_ac_full_derivative = None
|
|
857
|
+
eq_ligand_eq_full_derivative = None
|
|
858
|
+
|
|
859
|
+
# allocate the full jacobian matrix
|
|
860
|
+
ax_full_j = np.zeros([depth + 1, mol.natoms])
|
|
861
|
+
eq_full_j = np.zeros([depth + 1, mol.natoms])
|
|
862
|
+
ax_con_j = np.zeros([depth + 1, mol.natoms])
|
|
863
|
+
eq_con_j = np.zeros([depth + 1, mol.natoms])
|
|
864
|
+
|
|
865
|
+
# full ligand ACs
|
|
866
|
+
for i in range(0, n_ax): # for each ax ligand
|
|
867
|
+
ax_ligand_ac_full_derivative = full_autocorrelation_derivative(ax_ligand_list[i].mol, prop, depth)
|
|
868
|
+
# now we need to map back to full positions
|
|
869
|
+
for ii, row in enumerate(ax_ligand_ac_full_derivative):
|
|
870
|
+
for original_ids in list(ax_ligand_list[i].ext_int_dict.keys()):
|
|
871
|
+
ax_full_j[ii, original_ids] += np.divide(row[ax_ligand_list[i].ext_int_dict[original_ids]], n_ax)
|
|
872
|
+
|
|
873
|
+
for i in range(0, n_eq): # for each eq ligand
|
|
874
|
+
# now we need to map back to full positions
|
|
875
|
+
eq_ligand_eq_full_derivative = full_autocorrelation_derivative(eq_ligand_list[i].mol, prop, depth)
|
|
876
|
+
for ii, row in enumerate(eq_ligand_eq_full_derivative):
|
|
877
|
+
for original_ids in list(eq_ligand_list[i].ext_int_dict.keys()):
|
|
878
|
+
eq_full_j[ii, original_ids] += np.divide(row[eq_ligand_list[i].ext_int_dict[original_ids]], n_eq)
|
|
879
|
+
|
|
880
|
+
# ligand connection ACs
|
|
881
|
+
for i in range(0, n_ax):
|
|
882
|
+
ax_ligand_ac_con_derivative = atom_only_autocorrelation_derivative(ax_ligand_list[i].mol, prop, depth,
|
|
883
|
+
ax_con_int_list[i])
|
|
884
|
+
# now we need to map back to full positions
|
|
885
|
+
for ii, row in enumerate(ax_ligand_ac_con_derivative):
|
|
886
|
+
for original_ids in list(ax_ligand_list[i].ext_int_dict.keys()):
|
|
887
|
+
ax_con_j[ii, original_ids] += np.divide(row[ax_ligand_list[i].ext_int_dict[original_ids]], n_ax)
|
|
888
|
+
|
|
889
|
+
for i in range(0, n_eq):
|
|
890
|
+
eq_ligand_ac_con_derivative = atom_only_autocorrelation_derivative(eq_ligand_list[i].mol, prop, depth,
|
|
891
|
+
eq_con_int_list[i])
|
|
892
|
+
# now we need to map back to full positions
|
|
893
|
+
for ii, row in enumerate(eq_ligand_ac_con_derivative):
|
|
894
|
+
for original_ids in list(eq_ligand_list[i].ext_int_dict.keys()):
|
|
895
|
+
eq_con_j[ii, original_ids] += np.divide(row[eq_ligand_list[i].ext_int_dict[original_ids]], n_eq)
|
|
896
|
+
|
|
897
|
+
return ax_full_j, eq_full_j, ax_con_j, eq_con_j
|
|
898
|
+
|
|
899
|
+
|
|
900
|
+
def find_ligand_autocorrs_and_deltametrics_oct_dimers(mol, prop, loud, depth, name=False,
|
|
901
|
+
oct=True, custom_ligand_dict=False):
|
|
902
|
+
# # this function takes a
|
|
903
|
+
# # symmetric (axial == axial,
|
|
904
|
+
# # equatorial == equatorial)
|
|
905
|
+
# # octahedral complex
|
|
906
|
+
# # and returns autocorrelations for
|
|
907
|
+
# # the axial an equatorial ligands
|
|
908
|
+
# # custom_ligand_dict allows the user to skip the breakdown
|
|
909
|
+
# # in cases where 3D geo is not correct/formed
|
|
910
|
+
# # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
|
|
911
|
+
# # ax_con_int_list ,eq_con_int_list
|
|
912
|
+
# # with types: eq/ax_ligand_list list of mol3D
|
|
913
|
+
# # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
|
|
914
|
+
if not custom_ligand_dict:
|
|
915
|
+
raise ValueError('No custom ligand dict provided!')
|
|
916
|
+
# liglist, ligdents, ligcons = ligand_breakdown(mol)
|
|
917
|
+
# ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list, eq_con_int_list,
|
|
918
|
+
# ax_con_list, eq_con_list, built_ligand_list = ligand_assign(
|
|
919
|
+
# mol, liglist, ligdents, ligcons, loud, name=False)
|
|
920
|
+
else:
|
|
921
|
+
ax1_ligand_list = custom_ligand_dict["ax1_ligand_list"]
|
|
922
|
+
ax2_ligand_list = custom_ligand_dict["ax2_ligand_list"]
|
|
923
|
+
ax3_ligand_list = custom_ligand_dict["ax3_ligand_list"]
|
|
924
|
+
ax1_con_int_list = custom_ligand_dict["ax1_con_int_list"]
|
|
925
|
+
ax2_con_int_list = custom_ligand_dict["ax2_con_int_list"]
|
|
926
|
+
ax3_con_int_list = custom_ligand_dict["ax3_con_int_list"]
|
|
927
|
+
axligs = [ax1_ligand_list, ax2_ligand_list, ax3_ligand_list]
|
|
928
|
+
axcons = [ax1_con_int_list, ax2_con_int_list, ax3_con_int_list]
|
|
929
|
+
n_axs = [len(i) for i in axligs]
|
|
930
|
+
|
|
931
|
+
# get full ligand AC
|
|
932
|
+
ax_ligand_ac_fulls = [False, False, False]
|
|
933
|
+
|
|
934
|
+
for axnum in range(3):
|
|
935
|
+
ax_ligand_ac_full = list()
|
|
936
|
+
for i in range(0, n_axs[axnum]):
|
|
937
|
+
if not list(ax_ligand_ac_full):
|
|
938
|
+
ax_ligand_ac_full = full_autocorrelation(axligs[axnum][i].mol, prop, depth)
|
|
939
|
+
else:
|
|
940
|
+
ax_ligand_ac_full += full_autocorrelation(axligs[axnum][i].mol, prop, depth)
|
|
941
|
+
ax_ligand_ac_full = np.divide(ax_ligand_ac_full, n_axs[axnum])
|
|
942
|
+
ax_ligand_ac_fulls[axnum] = ax_ligand_ac_full
|
|
943
|
+
|
|
944
|
+
# get partial ligand AC
|
|
945
|
+
ax_ligand_ac_cons = [False, False, False]
|
|
946
|
+
|
|
947
|
+
for axnum in range(3):
|
|
948
|
+
ax_ligand_ac_con = list()
|
|
949
|
+
for i in range(0, n_axs[axnum]):
|
|
950
|
+
if not list(ax_ligand_ac_con):
|
|
951
|
+
ax_ligand_ac_con = atom_only_autocorrelation(axligs[axnum][i].mol, prop, depth, axcons[axnum][i])
|
|
952
|
+
else:
|
|
953
|
+
ax_ligand_ac_con += atom_only_autocorrelation(axligs[axnum][i].mol, prop, depth, axcons[axnum][i])
|
|
954
|
+
ax_ligand_ac_con = np.divide(ax_ligand_ac_con, n_axs[axnum])
|
|
955
|
+
ax_ligand_ac_cons[axnum] = ax_ligand_ac_con
|
|
956
|
+
|
|
957
|
+
# get deltametrics
|
|
958
|
+
ax_delta_cons = [False, False, False]
|
|
959
|
+
|
|
960
|
+
for axnum in range(3):
|
|
961
|
+
ax_delta_con = list()
|
|
962
|
+
for i in range(0, n_axs[axnum]):
|
|
963
|
+
if not list(ax_delta_con):
|
|
964
|
+
ax_delta_con = atom_only_deltametric(axligs[axnum][i].mol, prop, depth, axcons[axnum][i])
|
|
965
|
+
else:
|
|
966
|
+
ax_delta_con += atom_only_deltametric(axligs[axnum][i].mol, prop, depth, axcons[axnum][i])
|
|
967
|
+
ax_delta_con = np.divide(ax_delta_con, n_axs[axnum])
|
|
968
|
+
ax_delta_cons[axnum] = ax_delta_con
|
|
969
|
+
|
|
970
|
+
return ax_ligand_ac_fulls + ax_ligand_ac_cons + ax_delta_cons
|
|
971
|
+
|
|
972
|
+
|
|
973
|
+
def find_ligand_deltametrics_oct(mol, prop, loud, depth, name=False, oct=True, custom_ligand_dict=False):
|
|
974
|
+
# # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
|
|
975
|
+
# # ax_con_int_list ,eq_con_int_list
|
|
976
|
+
# # with types: eq/ax_ligand_list list of mol3D
|
|
977
|
+
# # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
|
|
978
|
+
# # this function takes a
|
|
979
|
+
# # octahedral complex
|
|
980
|
+
# # and returns deltametrics for
|
|
981
|
+
# # the axial an equatorial ligands
|
|
982
|
+
if not custom_ligand_dict:
|
|
983
|
+
liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
|
|
984
|
+
(ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list,
|
|
985
|
+
eq_con_int_list, ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
|
|
986
|
+
mol, liglist, ligdents, ligcons, loud, name=False)
|
|
987
|
+
else:
|
|
988
|
+
ax_ligand_list = custom_ligand_dict["ax_ligand_list"]
|
|
989
|
+
eq_ligand_list = custom_ligand_dict["eq_ligand_list"]
|
|
990
|
+
ax_con_int_list = custom_ligand_dict["ax_con_int_list"]
|
|
991
|
+
eq_con_int_list = custom_ligand_dict["eq_con_int_list"]
|
|
992
|
+
# count ligands
|
|
993
|
+
n_ax = len(ax_ligand_list)
|
|
994
|
+
n_eq = len(eq_ligand_list)
|
|
995
|
+
|
|
996
|
+
# get partial ligand AC
|
|
997
|
+
ax_ligand_ac_con = []
|
|
998
|
+
eq_ligand_ac_con = []
|
|
999
|
+
|
|
1000
|
+
for i in range(0, n_ax):
|
|
1001
|
+
if not list(ax_ligand_ac_con):
|
|
1002
|
+
ax_ligand_ac_con = atom_only_deltametric(ax_ligand_list[i].mol, prop, depth, ax_con_int_list[i])
|
|
1003
|
+
else:
|
|
1004
|
+
ax_ligand_ac_con += atom_only_deltametric(ax_ligand_list[i].mol, prop, depth, ax_con_int_list[i])
|
|
1005
|
+
ax_ligand_ac_con = np.divide(ax_ligand_ac_con, n_ax)
|
|
1006
|
+
for i in range(0, n_eq):
|
|
1007
|
+
if not list(eq_ligand_ac_con):
|
|
1008
|
+
eq_ligand_ac_con = atom_only_deltametric(eq_ligand_list[i].mol, prop, depth, eq_con_int_list[i])
|
|
1009
|
+
else:
|
|
1010
|
+
eq_ligand_ac_con += atom_only_deltametric(eq_ligand_list[i].mol, prop, depth, eq_con_int_list[i])
|
|
1011
|
+
eq_ligand_ac_con = np.divide(eq_ligand_ac_con, n_eq)
|
|
1012
|
+
|
|
1013
|
+
return ax_ligand_ac_con, eq_ligand_ac_con
|
|
1014
|
+
|
|
1015
|
+
|
|
1016
|
+
def find_ligand_deltametric_derivatives_oct(mol, prop, loud, depth, name=False, oct=True, custom_ligand_dict=False):
|
|
1017
|
+
# # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
|
|
1018
|
+
# # ax_con_int_list ,eq_con_int_list
|
|
1019
|
+
# # with types: eq/ax_ligand_list list of mol3D
|
|
1020
|
+
# # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
|
|
1021
|
+
# # this function takes a
|
|
1022
|
+
# # octahedral complex
|
|
1023
|
+
# # and returns deltametrics for
|
|
1024
|
+
# # the axial an equatorial ligands
|
|
1025
|
+
if not custom_ligand_dict:
|
|
1026
|
+
liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
|
|
1027
|
+
(ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list,
|
|
1028
|
+
eq_con_int_list, ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
|
|
1029
|
+
mol, liglist, ligdents, ligcons, loud, name=False)
|
|
1030
|
+
else:
|
|
1031
|
+
ax_ligand_list = custom_ligand_dict["ax_ligand_list"]
|
|
1032
|
+
eq_ligand_list = custom_ligand_dict["eq_ligand_list"]
|
|
1033
|
+
ax_con_int_list = custom_ligand_dict["ax_con_int_list"]
|
|
1034
|
+
eq_con_int_list = custom_ligand_dict["eq_con_int_list"]
|
|
1035
|
+
|
|
1036
|
+
# count ligands
|
|
1037
|
+
n_ax = len(ax_ligand_list)
|
|
1038
|
+
n_eq = len(eq_ligand_list)
|
|
1039
|
+
|
|
1040
|
+
# allocate the full jacobian matrix
|
|
1041
|
+
ax_con_j = np.zeros([depth + 1, mol.natoms])
|
|
1042
|
+
eq_con_j = np.zeros([depth + 1, mol.natoms])
|
|
1043
|
+
|
|
1044
|
+
for i in range(0, n_ax):
|
|
1045
|
+
ax_ligand_ac_con_derivative = atom_only_deltametric_derivative(ax_ligand_list[i].mol, prop, depth,
|
|
1046
|
+
ax_con_int_list[i])
|
|
1047
|
+
# now we need to map back to full positions
|
|
1048
|
+
for ii, row in enumerate(ax_ligand_ac_con_derivative):
|
|
1049
|
+
for original_ids in list(ax_ligand_list[i].ext_int_dict.keys()):
|
|
1050
|
+
ax_con_j[ii, original_ids] += np.divide(row[ax_ligand_list[i].ext_int_dict[original_ids]], n_ax)
|
|
1051
|
+
|
|
1052
|
+
for i in range(0, n_eq):
|
|
1053
|
+
eq_ligand_ac_con_derivative = atom_only_deltametric_derivative(eq_ligand_list[i].mol, prop, depth,
|
|
1054
|
+
eq_con_int_list[i])
|
|
1055
|
+
for ii, row in enumerate(eq_ligand_ac_con_derivative):
|
|
1056
|
+
for original_ids in list(eq_ligand_list[i].ext_int_dict.keys()):
|
|
1057
|
+
eq_con_j[ii, original_ids] += np.divide(row[eq_ligand_list[i].ext_int_dict[original_ids]], n_eq)
|
|
1058
|
+
|
|
1059
|
+
return ax_con_j, eq_con_j
|
|
1060
|
+
|
|
1061
|
+
|
|
1062
|
+
def find_mc_eq_ax_deltametrics_oct(mol, prop, loud, depth, name=False, oct=True,
|
|
1063
|
+
func=deltametric_catoms):
|
|
1064
|
+
# For octahedral complexes only.
|
|
1065
|
+
# Calculate mc/ax, mc/eq deltametrics.
|
|
1066
|
+
liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
|
|
1067
|
+
(ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list,
|
|
1068
|
+
eq_con_int_list, ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
|
|
1069
|
+
mol, liglist, ligdents, ligcons, loud, name=False)
|
|
1070
|
+
# shape reduce
|
|
1071
|
+
ax_con_list = [x[0] for x in ax_con_list]
|
|
1072
|
+
eq_con_list = [x[0] for x in eq_con_list]
|
|
1073
|
+
ax_ligand_del_mc = metal_only_deltametric(mol, prop, depth, catoms=ax_con_list, func=func)
|
|
1074
|
+
eq_ligand_del_mc = metal_only_deltametric(mol, prop, depth, catoms=eq_con_list, func=func)
|
|
1075
|
+
ax_ligand_del_mc = np.divide(ax_ligand_del_mc, len(ax_con_list))
|
|
1076
|
+
eq_ligand_del_mc = np.divide(eq_ligand_del_mc, len(eq_con_list))
|
|
1077
|
+
return ax_ligand_del_mc, eq_ligand_del_mc
|
|
1078
|
+
|
|
1079
|
+
|
|
1080
|
+
def find_mc_eq_ax_autocorrelation_oct(mol, prop, loud, depth, name=False, oct=True,
|
|
1081
|
+
func=autocorrelation_catoms, modifier=False):
|
|
1082
|
+
# For octahedral complexes only.
|
|
1083
|
+
# Calculate mc/ax, mc/eq deltametrics.
|
|
1084
|
+
liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
|
|
1085
|
+
(ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list,
|
|
1086
|
+
eq_con_int_list, ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
|
|
1087
|
+
mol, liglist, ligdents, ligcons, loud, name=False)
|
|
1088
|
+
# shape reduce
|
|
1089
|
+
ax_con_list = [x[0] for x in ax_con_list]
|
|
1090
|
+
eq_con_list = [x[0] for x in eq_con_list]
|
|
1091
|
+
ax_ligand_ac_mc = metal_only_autocorrelation(mol, prop, depth, catoms=ax_con_list, func=func, modifier=modifier)
|
|
1092
|
+
eq_ligand_ac_mc = metal_only_autocorrelation(mol, prop, depth, catoms=eq_con_list, func=func, modifier=modifier)
|
|
1093
|
+
ax_ligand_ac_mc = np.divide(ax_ligand_ac_mc, len(ax_con_list))
|
|
1094
|
+
eq_ligand_ac_mc = np.divide(eq_ligand_ac_mc, len(eq_con_list))
|
|
1095
|
+
return ax_ligand_ac_mc, eq_ligand_ac_mc
|
|
1096
|
+
|
|
1097
|
+
|
|
1098
|
+
def generate_mc_eq_ax_deltametrics(mol, loud, depth=4, name=False,
|
|
1099
|
+
func=deltametric_catoms, NumB=False, Gval=False):
|
|
1100
|
+
result_ax_mc = list()
|
|
1101
|
+
result_eq_mc = list()
|
|
1102
|
+
colnames = []
|
|
1103
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1104
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1105
|
+
if Gval:
|
|
1106
|
+
allowed_strings += ['group_number']
|
|
1107
|
+
labels_strings += ['Gval']
|
|
1108
|
+
if NumB:
|
|
1109
|
+
allowed_strings += ["num_bonds"]
|
|
1110
|
+
labels_strings += ["NumB"]
|
|
1111
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1112
|
+
ax_ligand_ac_con, eq_ligand_ac_con = find_mc_eq_ax_deltametrics_oct(mol, properties, loud, depth, name,
|
|
1113
|
+
func=func)
|
|
1114
|
+
this_colnames = []
|
|
1115
|
+
for i in range(0, depth + 1):
|
|
1116
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1117
|
+
colnames.append(this_colnames)
|
|
1118
|
+
result_ax_mc.append(ax_ligand_ac_con)
|
|
1119
|
+
result_eq_mc.append(eq_ligand_ac_con)
|
|
1120
|
+
results_dictionary = {'colnames': colnames, 'result_mc_ax_del': result_ax_mc,
|
|
1121
|
+
'result_mc_eq_del': result_eq_mc}
|
|
1122
|
+
return results_dictionary
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
def generate_mc_eq_ax_autocorrelation(mol, loud, depth=4, name=False,
|
|
1126
|
+
func=autocorrelation_catoms, NumB=False, Gval=False):
|
|
1127
|
+
result_ax_mc = list()
|
|
1128
|
+
result_eq_mc = list()
|
|
1129
|
+
colnames = []
|
|
1130
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1131
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1132
|
+
if Gval:
|
|
1133
|
+
allowed_strings += ['group_number']
|
|
1134
|
+
labels_strings += ['Gval']
|
|
1135
|
+
if NumB:
|
|
1136
|
+
allowed_strings += ["num_bonds"]
|
|
1137
|
+
labels_strings += ["NumB"]
|
|
1138
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1139
|
+
ax_ligand_ac_con, eq_ligand_ac_con = find_mc_eq_ax_autocorrelation_oct(mol, properties, loud, depth, name,
|
|
1140
|
+
func=func)
|
|
1141
|
+
this_colnames = []
|
|
1142
|
+
for i in range(0, depth + 1):
|
|
1143
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1144
|
+
colnames.append(this_colnames)
|
|
1145
|
+
result_ax_mc.append(ax_ligand_ac_con)
|
|
1146
|
+
result_eq_mc.append(eq_ligand_ac_con)
|
|
1147
|
+
results_dictionary = {'colnames': colnames, 'result_mc_ax_ac': result_ax_mc,
|
|
1148
|
+
'result_mc_eq_ac': result_eq_mc}
|
|
1149
|
+
return results_dictionary
|
|
1150
|
+
|
|
1151
|
+
|
|
1152
|
+
def generate_all_ligand_autocorrelations(mol, loud, depth=4, name=False, flag_name=False,
|
|
1153
|
+
custom_ligand_dict=False, NumB=False, Gval=False):
|
|
1154
|
+
# # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
|
|
1155
|
+
# # ax_con_int_list ,eq_con_int_list
|
|
1156
|
+
# # with types: eq/ax_ligand_list list of mol3D
|
|
1157
|
+
# # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
|
|
1158
|
+
result_ax_full = list()
|
|
1159
|
+
result_eq_full = list()
|
|
1160
|
+
result_ax_con = list()
|
|
1161
|
+
result_eq_con = list()
|
|
1162
|
+
colnames = []
|
|
1163
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1164
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1165
|
+
if Gval:
|
|
1166
|
+
allowed_strings += ['group_number']
|
|
1167
|
+
labels_strings += ['Gval']
|
|
1168
|
+
if NumB:
|
|
1169
|
+
allowed_strings += ["num_bonds"]
|
|
1170
|
+
labels_strings += ["NumB"]
|
|
1171
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1172
|
+
(ax_ligand_ac_full,
|
|
1173
|
+
eq_ligand_ac_full,
|
|
1174
|
+
ax_ligand_ac_con,
|
|
1175
|
+
eq_ligand_ac_con) = find_ligand_autocorrelations_oct(
|
|
1176
|
+
mol,
|
|
1177
|
+
properties,
|
|
1178
|
+
loud=loud,
|
|
1179
|
+
depth=depth,
|
|
1180
|
+
name=name,
|
|
1181
|
+
oct=True,
|
|
1182
|
+
custom_ligand_dict=custom_ligand_dict)
|
|
1183
|
+
this_colnames = []
|
|
1184
|
+
for i in range(0, depth + 1):
|
|
1185
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1186
|
+
colnames.append(this_colnames)
|
|
1187
|
+
result_ax_full.append(ax_ligand_ac_full)
|
|
1188
|
+
result_eq_full.append(eq_ligand_ac_full)
|
|
1189
|
+
result_ax_con.append(ax_ligand_ac_con)
|
|
1190
|
+
result_eq_con.append(eq_ligand_ac_con)
|
|
1191
|
+
if flag_name:
|
|
1192
|
+
results_dictionary = {'colnames': colnames,
|
|
1193
|
+
'result_ax_full_ac': result_ax_full,
|
|
1194
|
+
'result_eq_full_ac': result_eq_full,
|
|
1195
|
+
'result_ax_con_ac': result_ax_con,
|
|
1196
|
+
'result_eq_con_ac': result_eq_con}
|
|
1197
|
+
else:
|
|
1198
|
+
results_dictionary = {'colnames': colnames,
|
|
1199
|
+
'result_ax_full': result_ax_full,
|
|
1200
|
+
'result_eq_full': result_eq_full,
|
|
1201
|
+
'result_ax_con': result_ax_con,
|
|
1202
|
+
'result_eq_con': result_eq_con}
|
|
1203
|
+
return results_dictionary
|
|
1204
|
+
|
|
1205
|
+
|
|
1206
|
+
def generate_all_ligand_autocorrelation_derivatives(mol, loud, depth=4, name=False, flag_name=False,
|
|
1207
|
+
custom_ligand_dict=False, NumB=False, Gval=False):
|
|
1208
|
+
# # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
|
|
1209
|
+
# # ax_con_int_list ,eq_con_int_list
|
|
1210
|
+
# # with types: eq/ax_ligand_list list of mol3D
|
|
1211
|
+
# # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
|
|
1212
|
+
result_ax_full = None
|
|
1213
|
+
result_eq_full = None
|
|
1214
|
+
result_ax_con = None
|
|
1215
|
+
result_eq_con = None
|
|
1216
|
+
|
|
1217
|
+
colnames = []
|
|
1218
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1219
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1220
|
+
if Gval:
|
|
1221
|
+
allowed_strings += ['group_number']
|
|
1222
|
+
labels_strings += ['Gval']
|
|
1223
|
+
if NumB:
|
|
1224
|
+
allowed_strings += ["num_bonds"]
|
|
1225
|
+
labels_strings += ["NumB"]
|
|
1226
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1227
|
+
ax_ligand_ac_full, eq_ligand_ac_full, ax_ligand_ac_con, eq_ligand_ac_con = find_ligand_autocorrelation_derivatives_oct(
|
|
1228
|
+
mol,
|
|
1229
|
+
properties,
|
|
1230
|
+
loud=loud,
|
|
1231
|
+
depth=depth,
|
|
1232
|
+
name=name,
|
|
1233
|
+
oct=True,
|
|
1234
|
+
custom_ligand_dict=custom_ligand_dict)
|
|
1235
|
+
for i in range(0, depth + 1):
|
|
1236
|
+
colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
|
|
1237
|
+
range(0, mol.natoms)])
|
|
1238
|
+
if result_ax_full is None:
|
|
1239
|
+
result_ax_full = ax_ligand_ac_full
|
|
1240
|
+
else:
|
|
1241
|
+
result_ax_full = np.row_stack([result_ax_full, ax_ligand_ac_full])
|
|
1242
|
+
|
|
1243
|
+
if result_eq_full is None:
|
|
1244
|
+
result_eq_full = eq_ligand_ac_full
|
|
1245
|
+
else:
|
|
1246
|
+
result_eq_full = np.row_stack([result_eq_full, eq_ligand_ac_full])
|
|
1247
|
+
|
|
1248
|
+
if result_ax_con is None:
|
|
1249
|
+
result_ax_con = ax_ligand_ac_con
|
|
1250
|
+
else:
|
|
1251
|
+
result_ax_con = np.row_stack([result_ax_con, ax_ligand_ac_con])
|
|
1252
|
+
|
|
1253
|
+
if result_eq_con is None:
|
|
1254
|
+
result_eq_con = eq_ligand_ac_con
|
|
1255
|
+
else:
|
|
1256
|
+
result_eq_con = np.row_stack([result_eq_con, eq_ligand_ac_con])
|
|
1257
|
+
|
|
1258
|
+
if flag_name:
|
|
1259
|
+
results_dictionary = {'colnames': colnames, 'result_ax_full_ac': result_ax_full,
|
|
1260
|
+
'result_eq_full_ac': result_eq_full,
|
|
1261
|
+
'result_ax_con_ac': result_ax_con, 'result_eq_con_ac': result_eq_con}
|
|
1262
|
+
else:
|
|
1263
|
+
results_dictionary = {'colnames': colnames, 'result_ax_full': result_ax_full, 'result_eq_full': result_eq_full,
|
|
1264
|
+
'result_ax_con': result_ax_con, 'result_eq_con': result_eq_con}
|
|
1265
|
+
return results_dictionary
|
|
1266
|
+
|
|
1267
|
+
|
|
1268
|
+
def generate_all_ligand_autocorrs_and_deltametrics_dimers(mol, loud, depth=4, name=False, flag_name=False,
|
|
1269
|
+
custom_ligand_dict=False, NumB=False, Gval=False):
|
|
1270
|
+
# # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
|
|
1271
|
+
# # ax_con_int_list ,eq_con_int_list
|
|
1272
|
+
# # with types: eq/ax_ligand_list list of mol3D
|
|
1273
|
+
# # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
|
|
1274
|
+
result_ax1_full = list()
|
|
1275
|
+
result_ax2_full = list()
|
|
1276
|
+
result_ax3_full = list()
|
|
1277
|
+
result_ax1_con = list()
|
|
1278
|
+
result_ax2_con = list()
|
|
1279
|
+
result_ax3_con = list()
|
|
1280
|
+
result_delta_ax1_con = list()
|
|
1281
|
+
result_delta_ax2_con = list()
|
|
1282
|
+
result_delta_ax3_con = list()
|
|
1283
|
+
|
|
1284
|
+
colnames = []
|
|
1285
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1286
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1287
|
+
if Gval:
|
|
1288
|
+
allowed_strings += ['group_number']
|
|
1289
|
+
labels_strings += ['Gval']
|
|
1290
|
+
if NumB:
|
|
1291
|
+
allowed_strings += ["num_bonds"]
|
|
1292
|
+
labels_strings += ["NumB"]
|
|
1293
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1294
|
+
# lig_autocorrs is a list of length 6 (ax{i}_ligand_ac_fulls, ax{i}_ligand_ac_cons)
|
|
1295
|
+
lig_autocorrs = find_ligand_autocorrs_and_deltametrics_oct_dimers(mol,
|
|
1296
|
+
properties,
|
|
1297
|
+
loud=loud,
|
|
1298
|
+
depth=depth,
|
|
1299
|
+
name=name,
|
|
1300
|
+
oct=True,
|
|
1301
|
+
custom_ligand_dict=custom_ligand_dict)
|
|
1302
|
+
this_colnames = []
|
|
1303
|
+
assert all([len(i) > 0 for i in lig_autocorrs]), 'Some ligand autocorrelations are empty! %s' % lig_autocorrs
|
|
1304
|
+
for i in range(0, depth + 1):
|
|
1305
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1306
|
+
colnames.append(this_colnames)
|
|
1307
|
+
result_ax1_full.append(lig_autocorrs[0])
|
|
1308
|
+
result_ax2_full.append(lig_autocorrs[1])
|
|
1309
|
+
result_ax3_full.append(lig_autocorrs[2])
|
|
1310
|
+
result_ax1_con.append(lig_autocorrs[3])
|
|
1311
|
+
result_ax2_con.append(lig_autocorrs[4])
|
|
1312
|
+
result_ax3_con.append(lig_autocorrs[5])
|
|
1313
|
+
result_delta_ax1_con.append(lig_autocorrs[6])
|
|
1314
|
+
result_delta_ax2_con.append(lig_autocorrs[7])
|
|
1315
|
+
result_delta_ax3_con.append(lig_autocorrs[8])
|
|
1316
|
+
|
|
1317
|
+
results_dictionary = {'colnames': colnames,
|
|
1318
|
+
'result_ax1_full': result_ax1_full,
|
|
1319
|
+
'result_ax2_full': result_ax2_full,
|
|
1320
|
+
'result_ax3_full': result_ax3_full,
|
|
1321
|
+
'result_ax1_con': result_ax1_con,
|
|
1322
|
+
'result_ax2_con': result_ax2_con,
|
|
1323
|
+
'result_ax3_con': result_ax3_con,
|
|
1324
|
+
'result_delta_ax1_con': result_delta_ax1_con,
|
|
1325
|
+
'result_delta_ax2_con': result_delta_ax2_con,
|
|
1326
|
+
'result_delta_ax3_con': result_delta_ax3_con}
|
|
1327
|
+
# if flag_name:
|
|
1328
|
+
# results_dictionary = {'colnames': colnames, 'result_ax_full_ac': result_ax_full,
|
|
1329
|
+
# 'result_eq_full_ac': result_eq_full,
|
|
1330
|
+
# 'result_ax_con_ac': result_ax_con, 'result_eq_con_ac': result_eq_con}
|
|
1331
|
+
# else:
|
|
1332
|
+
# results_dictionary = {'colnames': colnames, 'result_ax_full': result_ax_full, 'result_eq_full': result_eq_full,
|
|
1333
|
+
# 'result_ax_con': result_ax_con, 'result_eq_con': result_eq_con}
|
|
1334
|
+
return results_dictionary
|
|
1335
|
+
|
|
1336
|
+
|
|
1337
|
+
def generate_all_ligand_deltametrics(mol, loud, depth=4, name=False, flag_name=False,
|
|
1338
|
+
custom_ligand_dict=False, NumB=False, Gval=False):
|
|
1339
|
+
# # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
|
|
1340
|
+
# # ax_con_int_list ,eq_con_int_list
|
|
1341
|
+
# # with types: eq/ax_ligand_list list of mol3D
|
|
1342
|
+
# # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
|
|
1343
|
+
|
|
1344
|
+
result_ax_con = list()
|
|
1345
|
+
result_eq_con = list()
|
|
1346
|
+
colnames = []
|
|
1347
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1348
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1349
|
+
if Gval:
|
|
1350
|
+
allowed_strings += ['group_number']
|
|
1351
|
+
labels_strings += ['Gval']
|
|
1352
|
+
if NumB:
|
|
1353
|
+
allowed_strings += ["num_bonds"]
|
|
1354
|
+
labels_strings += ["NumB"]
|
|
1355
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1356
|
+
ax_ligand_ac_con, eq_ligand_ac_con = find_ligand_deltametrics_oct(mol, properties, loud, depth, name, oct=True,
|
|
1357
|
+
custom_ligand_dict=custom_ligand_dict)
|
|
1358
|
+
this_colnames = []
|
|
1359
|
+
for i in range(0, depth + 1):
|
|
1360
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1361
|
+
colnames.append(this_colnames)
|
|
1362
|
+
result_ax_con.append(ax_ligand_ac_con)
|
|
1363
|
+
result_eq_con.append(eq_ligand_ac_con)
|
|
1364
|
+
if flag_name:
|
|
1365
|
+
results_dictionary = {'colnames': colnames, 'result_ax_con_del': result_ax_con,
|
|
1366
|
+
'result_eq_con_del': result_eq_con}
|
|
1367
|
+
else:
|
|
1368
|
+
results_dictionary = {'colnames': colnames, 'result_ax_con': result_ax_con, 'result_eq_con': result_eq_con}
|
|
1369
|
+
return results_dictionary
|
|
1370
|
+
|
|
1371
|
+
|
|
1372
|
+
def generate_all_ligand_deltametric_derivatives(mol, loud, depth=4, name=False, flag_name=False,
|
|
1373
|
+
custom_ligand_dict=False, NumB=False, Gval=False):
|
|
1374
|
+
# # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
|
|
1375
|
+
# # ax_con_int_list ,eq_con_int_list
|
|
1376
|
+
# # with types: eq/ax_ligand_list list of mol3D
|
|
1377
|
+
# # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
|
|
1378
|
+
|
|
1379
|
+
result_ax_con = None
|
|
1380
|
+
result_eq_con = None
|
|
1381
|
+
colnames = []
|
|
1382
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1383
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1384
|
+
if Gval:
|
|
1385
|
+
allowed_strings += ['group_number']
|
|
1386
|
+
labels_strings += ['Gval']
|
|
1387
|
+
if NumB:
|
|
1388
|
+
allowed_strings += ["num_bonds"]
|
|
1389
|
+
labels_strings += ["NumB"]
|
|
1390
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1391
|
+
ax_ligand_ac_con, eq_ligand_ac_con = find_ligand_deltametric_derivatives_oct(mol, properties, loud, depth, name,
|
|
1392
|
+
oct=True,
|
|
1393
|
+
custom_ligand_dict=custom_ligand_dict)
|
|
1394
|
+
|
|
1395
|
+
for i in range(0, depth + 1):
|
|
1396
|
+
colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
|
|
1397
|
+
range(0, mol.natoms)])
|
|
1398
|
+
if result_ax_con is None:
|
|
1399
|
+
result_ax_con = ax_ligand_ac_con
|
|
1400
|
+
else:
|
|
1401
|
+
result_ax_con = np.row_stack([result_ax_con, ax_ligand_ac_con])
|
|
1402
|
+
if result_eq_con is None:
|
|
1403
|
+
result_eq_con = eq_ligand_ac_con
|
|
1404
|
+
else:
|
|
1405
|
+
result_eq_con = np.row_stack([result_eq_con, eq_ligand_ac_con])
|
|
1406
|
+
if flag_name:
|
|
1407
|
+
results_dictionary = {'colnames': colnames, 'result_ax_con_del': result_ax_con,
|
|
1408
|
+
'result_eq_con_del': result_eq_con}
|
|
1409
|
+
else:
|
|
1410
|
+
results_dictionary = {'colnames': colnames, 'result_ax_con': result_ax_con, 'result_eq_con': result_eq_con}
|
|
1411
|
+
return results_dictionary
|
|
1412
|
+
|
|
1413
|
+
|
|
1414
|
+
def generate_metal_autocorrelations(mol, loud, depth=4, oct=True, flag_name=False,
|
|
1415
|
+
modifier=False, NumB=False, Gval=False):
|
|
1416
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1417
|
+
result = list()
|
|
1418
|
+
colnames = []
|
|
1419
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1420
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1421
|
+
if Gval:
|
|
1422
|
+
allowed_strings += ['group_number']
|
|
1423
|
+
labels_strings += ['Gval']
|
|
1424
|
+
if NumB:
|
|
1425
|
+
allowed_strings += ["num_bonds"]
|
|
1426
|
+
labels_strings += ["NumB"]
|
|
1427
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1428
|
+
metal_ac = metal_only_autocorrelation(mol, properties, depth, oct=oct, modifier=modifier)
|
|
1429
|
+
this_colnames = []
|
|
1430
|
+
for i in range(0, depth + 1):
|
|
1431
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1432
|
+
colnames.append(this_colnames)
|
|
1433
|
+
result.append(metal_ac)
|
|
1434
|
+
if flag_name:
|
|
1435
|
+
results_dictionary = {'colnames': colnames, 'results_mc_ac': result}
|
|
1436
|
+
else:
|
|
1437
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1438
|
+
return results_dictionary
|
|
1439
|
+
|
|
1440
|
+
|
|
1441
|
+
def generate_metal_autocorrelation_derivatives(mol, loud, depth=4, oct=True, flag_name=False,
|
|
1442
|
+
modifier=False, NumB=False, Gval=False):
|
|
1443
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1444
|
+
result = None
|
|
1445
|
+
colnames = []
|
|
1446
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1447
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1448
|
+
if Gval:
|
|
1449
|
+
allowed_strings += ['group_number']
|
|
1450
|
+
labels_strings += ['Gval']
|
|
1451
|
+
if NumB:
|
|
1452
|
+
allowed_strings += ["num_bonds"]
|
|
1453
|
+
labels_strings += ["NumB"]
|
|
1454
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1455
|
+
metal_ac_der = metal_only_autocorrelation_derivative(mol, properties, depth, oct=oct, modifier=modifier)
|
|
1456
|
+
for i in range(0, depth + 1):
|
|
1457
|
+
colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
|
|
1458
|
+
range(0, mol.natoms)])
|
|
1459
|
+
|
|
1460
|
+
if result is None:
|
|
1461
|
+
result = metal_ac_der
|
|
1462
|
+
else:
|
|
1463
|
+
result = np.row_stack([result, metal_ac_der])
|
|
1464
|
+
if flag_name:
|
|
1465
|
+
results_dictionary = {'colnames': colnames, 'results_mc_ac': result}
|
|
1466
|
+
else:
|
|
1467
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1468
|
+
return results_dictionary
|
|
1469
|
+
|
|
1470
|
+
|
|
1471
|
+
def generate_multimetal_autocorrelations(mol, loud, depth=4, oct=True, flag_name=False, polarizability=False, Gval=False):
|
|
1472
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1473
|
+
result = list()
|
|
1474
|
+
colnames = []
|
|
1475
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1476
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1477
|
+
if Gval:
|
|
1478
|
+
allowed_strings += ['group_number']
|
|
1479
|
+
labels_strings += ['Gval']
|
|
1480
|
+
if polarizability:
|
|
1481
|
+
allowed_strings += ['polarizability']
|
|
1482
|
+
labels_strings += ['alpha']
|
|
1483
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1484
|
+
metal_ac = multimetal_only_autocorrelation(mol, properties, depth, oct=oct)
|
|
1485
|
+
this_colnames = []
|
|
1486
|
+
for i in range(0, depth + 1):
|
|
1487
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1488
|
+
colnames.append(this_colnames)
|
|
1489
|
+
result.append(metal_ac)
|
|
1490
|
+
if flag_name:
|
|
1491
|
+
results_dictionary = {'colnames': colnames, 'results_mc_ac': result}
|
|
1492
|
+
else:
|
|
1493
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1494
|
+
return results_dictionary
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
def generate_multiatom_autocorrelations(mol, loud, depth=4, oct=True, flag_name=False, additional_elements=False):
|
|
1498
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1499
|
+
result = list()
|
|
1500
|
+
colnames = []
|
|
1501
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1502
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1503
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1504
|
+
metal_ac = multiatom_only_autocorrelation(mol, properties, depth, oct=oct, additional_elements=additional_elements)
|
|
1505
|
+
this_colnames = []
|
|
1506
|
+
for i in range(0, depth + 1):
|
|
1507
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1508
|
+
colnames.append(this_colnames)
|
|
1509
|
+
result.append(metal_ac)
|
|
1510
|
+
if flag_name:
|
|
1511
|
+
results_dictionary = {'colnames': colnames, 'results_mc_ac': result}
|
|
1512
|
+
else:
|
|
1513
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1514
|
+
return results_dictionary
|
|
1515
|
+
|
|
1516
|
+
|
|
1517
|
+
def generate_metal_ox_autocorrelations(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
|
|
1518
|
+
# # oxmodifier - dict, used to modify prop vector (e.g. for adding
|
|
1519
|
+
# # ONLY used with ox_nuclear_charge ox or charge)
|
|
1520
|
+
# # {"Fe":2, "Co": 3} etc, normally only 1 metal...
|
|
1521
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1522
|
+
result = list()
|
|
1523
|
+
colnames = []
|
|
1524
|
+
metal_ox_ac = metal_only_autocorrelation(mol, 'ox_nuclear_charge', depth, oct=oct, modifier=oxmodifier)
|
|
1525
|
+
this_colnames = []
|
|
1526
|
+
for i in range(0, depth + 1):
|
|
1527
|
+
this_colnames.append('O' + '-' + str(i))
|
|
1528
|
+
colnames.append(this_colnames)
|
|
1529
|
+
result.append(metal_ox_ac)
|
|
1530
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1531
|
+
return results_dictionary
|
|
1532
|
+
|
|
1533
|
+
|
|
1534
|
+
def generate_metal_ox_autocorrelation_derivatives(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
|
|
1535
|
+
# # oxmodifier - dict, used to modify prop vector (e.g. for adding
|
|
1536
|
+
# # ONLY used with ox_nuclear_charge ox or charge)
|
|
1537
|
+
# # {"Fe":2, "Co": 3} etc, normally only 1 metal...
|
|
1538
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1539
|
+
result = None
|
|
1540
|
+
colnames = []
|
|
1541
|
+
metal_ox_ac = metal_only_autocorrelation_derivative(mol, 'ox_nuclear_charge', depth, oct=oct, modifier=oxmodifier)
|
|
1542
|
+
for i in range(0, depth + 1):
|
|
1543
|
+
colnames.append(['d' + 'O' + '-' + str(i) + '/d' + 'O' + str(j) for j in range(0, mol.natoms)])
|
|
1544
|
+
result = metal_ox_ac
|
|
1545
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1546
|
+
return results_dictionary
|
|
1547
|
+
|
|
1548
|
+
|
|
1549
|
+
def generate_metal_ox_deltametrics(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
|
|
1550
|
+
# # oxmodifier - dict, used to modify prop vector (e.g. for adding
|
|
1551
|
+
# # ONLY used with ox_nuclear_charge ox or charge)
|
|
1552
|
+
# # {"Fe":2, "Co": 3} etc, normally only 1 metal...
|
|
1553
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1554
|
+
result = list()
|
|
1555
|
+
colnames = []
|
|
1556
|
+
metal_ox_ac = metal_only_deltametric(mol, 'ox_nuclear_charge', depth, oct=oct, modifier=oxmodifier)
|
|
1557
|
+
this_colnames = []
|
|
1558
|
+
for i in range(0, depth + 1):
|
|
1559
|
+
this_colnames.append('O' + '-' + str(i))
|
|
1560
|
+
colnames.append(this_colnames)
|
|
1561
|
+
result.append(metal_ox_ac)
|
|
1562
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1563
|
+
return results_dictionary
|
|
1564
|
+
|
|
1565
|
+
|
|
1566
|
+
def generate_metal_ox_deltametric_derivatives(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
|
|
1567
|
+
# # oxmodifier - dict, used to modify prop vector (e.g. for adding
|
|
1568
|
+
# # ONLY used with ox_nuclear_charge ox or charge)
|
|
1569
|
+
# # {"Fe":2, "Co": 3} etc, normally only 1 metal...
|
|
1570
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1571
|
+
result = list()
|
|
1572
|
+
colnames = []
|
|
1573
|
+
metal_ox_ac = metal_only_deltametric_derivative(mol, 'ox_nuclear_charge', depth, oct=oct, modifier=oxmodifier)
|
|
1574
|
+
for i in range(0, depth + 1):
|
|
1575
|
+
colnames.append(['d' + 'O' + '-' + str(i) + '/d' + 'O' + str(j) for j in range(0, mol.natoms)])
|
|
1576
|
+
|
|
1577
|
+
result = metal_ox_ac
|
|
1578
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1579
|
+
return results_dictionary
|
|
1580
|
+
|
|
1581
|
+
|
|
1582
|
+
def generate_metal_ox_eff_autocorrelations(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
|
|
1583
|
+
# # oxmodifier - dict, used to modify prop vector (e.g. for adding
|
|
1584
|
+
# # ONLY used with ox_nuclear_charge ox or charge)
|
|
1585
|
+
# # {"Fe":2, "Co": 3} etc, normally only 1 metal...
|
|
1586
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1587
|
+
result = list()
|
|
1588
|
+
colnames = []
|
|
1589
|
+
metal_ox_ac = metal_only_autocorrelation(mol, 'group_number', depth, oct=oct, modifier=oxmodifier)
|
|
1590
|
+
this_colnames = []
|
|
1591
|
+
for i in range(0, depth + 1):
|
|
1592
|
+
this_colnames.append('Gval' + '-' + str(i))
|
|
1593
|
+
colnames.append(this_colnames)
|
|
1594
|
+
result.append(metal_ox_ac)
|
|
1595
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1596
|
+
return results_dictionary
|
|
1597
|
+
|
|
1598
|
+
|
|
1599
|
+
def generate_metal_ox_eff_deltametrics(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
|
|
1600
|
+
# # oxmodifier - dict, used to modify prop vector (e.g. for adding
|
|
1601
|
+
# # ONLY used with ox_nuclear_charge ox or charge)
|
|
1602
|
+
# # {"Fe":2, "Co": 3} etc, normally only 1 metal...
|
|
1603
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1604
|
+
result = list()
|
|
1605
|
+
colnames = []
|
|
1606
|
+
metal_ox_ac = metal_only_deltametric(mol, 'group_number', depth, oct=oct, modifier=oxmodifier)
|
|
1607
|
+
this_colnames = []
|
|
1608
|
+
for i in range(0, depth + 1):
|
|
1609
|
+
this_colnames.append('Gval' + '-' + str(i))
|
|
1610
|
+
colnames.append(this_colnames)
|
|
1611
|
+
result.append(metal_ox_ac)
|
|
1612
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1613
|
+
return results_dictionary
|
|
1614
|
+
|
|
1615
|
+
|
|
1616
|
+
def generate_metal_deltametrics(mol, loud, depth=4, oct=True, flag_name=False,
|
|
1617
|
+
modifier=False, NumB=False, Gval=False):
|
|
1618
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1619
|
+
result = list()
|
|
1620
|
+
colnames = []
|
|
1621
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1622
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1623
|
+
if Gval:
|
|
1624
|
+
allowed_strings += ['group_number']
|
|
1625
|
+
labels_strings += ['Gval']
|
|
1626
|
+
if NumB:
|
|
1627
|
+
allowed_strings += ["num_bonds"]
|
|
1628
|
+
labels_strings += ["NumB"]
|
|
1629
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1630
|
+
metal_ac = metal_only_deltametric(mol, properties, depth, oct=oct, modifier=modifier)
|
|
1631
|
+
this_colnames = []
|
|
1632
|
+
for i in range(0, depth + 1):
|
|
1633
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1634
|
+
colnames.append(this_colnames)
|
|
1635
|
+
result.append(metal_ac)
|
|
1636
|
+
if flag_name:
|
|
1637
|
+
results_dictionary = {'colnames': colnames, 'results_mc_del': result}
|
|
1638
|
+
else:
|
|
1639
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1640
|
+
return results_dictionary
|
|
1641
|
+
|
|
1642
|
+
|
|
1643
|
+
def generate_metal_deltametric_derivatives(mol, loud, depth=4, oct=True, flag_name=False,
|
|
1644
|
+
modifier=False, NumB=False, Gval=False):
|
|
1645
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1646
|
+
result = None
|
|
1647
|
+
colnames = []
|
|
1648
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1649
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1650
|
+
if Gval:
|
|
1651
|
+
allowed_strings += ['group_number']
|
|
1652
|
+
labels_strings += ['Gval']
|
|
1653
|
+
if NumB:
|
|
1654
|
+
allowed_strings += ["num_bonds"]
|
|
1655
|
+
labels_strings += ["NumB"]
|
|
1656
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1657
|
+
metal_ac_der = metal_only_deltametric_derivative(mol, properties, depth, oct=oct, modifier=modifier)
|
|
1658
|
+
for i in range(0, depth + 1):
|
|
1659
|
+
colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
|
|
1660
|
+
range(0, mol.natoms)])
|
|
1661
|
+
if result is None:
|
|
1662
|
+
result = metal_ac_der
|
|
1663
|
+
else:
|
|
1664
|
+
result = np.row_stack([result, metal_ac_der])
|
|
1665
|
+
if flag_name:
|
|
1666
|
+
results_dictionary = {'colnames': colnames, 'results_mc_del': result}
|
|
1667
|
+
else:
|
|
1668
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1669
|
+
return results_dictionary
|
|
1670
|
+
|
|
1671
|
+
|
|
1672
|
+
def generate_multimetal_deltametrics(mol, loud, depth=4, oct=True, flag_name=False, polarizability=False, Gval=False):
|
|
1673
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1674
|
+
result = list()
|
|
1675
|
+
colnames = []
|
|
1676
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1677
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1678
|
+
if Gval:
|
|
1679
|
+
allowed_strings += ['group_number']
|
|
1680
|
+
labels_strings += ['Gval']
|
|
1681
|
+
if polarizability:
|
|
1682
|
+
allowed_strings += ['polarizability']
|
|
1683
|
+
labels_strings += ['alpha']
|
|
1684
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1685
|
+
metal_ac = multimetal_only_deltametric(mol, properties, depth, oct=oct)
|
|
1686
|
+
this_colnames = []
|
|
1687
|
+
for i in range(0, depth + 1):
|
|
1688
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1689
|
+
colnames.append(this_colnames)
|
|
1690
|
+
result.append(metal_ac)
|
|
1691
|
+
if flag_name:
|
|
1692
|
+
results_dictionary = {'colnames': colnames, 'results_mc_del': result}
|
|
1693
|
+
else:
|
|
1694
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1695
|
+
return results_dictionary
|
|
1696
|
+
|
|
1697
|
+
|
|
1698
|
+
def generate_multiatom_deltametrics(mol, loud, depth=4, oct=True, flag_name=False, additional_elements=False):
|
|
1699
|
+
# oct - bool, if complex is octahedral, will use better bond checks
|
|
1700
|
+
result = list()
|
|
1701
|
+
colnames = []
|
|
1702
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1703
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1704
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1705
|
+
metal_ac = multiatom_only_deltametric(mol, properties, depth, oct=oct, additional_elements=additional_elements)
|
|
1706
|
+
this_colnames = []
|
|
1707
|
+
for i in range(0, depth + 1):
|
|
1708
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1709
|
+
colnames.append(this_colnames)
|
|
1710
|
+
result.append(metal_ac)
|
|
1711
|
+
if flag_name:
|
|
1712
|
+
results_dictionary = {'colnames': colnames, 'results_mc_del': result}
|
|
1713
|
+
else:
|
|
1714
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1715
|
+
return results_dictionary
|
|
1716
|
+
|
|
1717
|
+
|
|
1718
|
+
def generate_full_complex_autocorrelations(mol, loud,
|
|
1719
|
+
depth=4, oct=True,
|
|
1720
|
+
flag_name=False, modifier=False,
|
|
1721
|
+
use_dist=False, NumB=False, Gval=False, polarizability=False):
|
|
1722
|
+
result = list()
|
|
1723
|
+
colnames = []
|
|
1724
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1725
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1726
|
+
if Gval:
|
|
1727
|
+
allowed_strings += ['group_number']
|
|
1728
|
+
labels_strings += ['Gval']
|
|
1729
|
+
if NumB:
|
|
1730
|
+
allowed_strings += ["num_bonds"]
|
|
1731
|
+
labels_strings += ["NumB"]
|
|
1732
|
+
if polarizability:
|
|
1733
|
+
allowed_strings += ["polarizability"]
|
|
1734
|
+
labels_strings += ["alpha"]
|
|
1735
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1736
|
+
metal_ac = full_autocorrelation(mol, properties, depth,
|
|
1737
|
+
oct=oct, modifier=modifier,
|
|
1738
|
+
use_dist=use_dist)
|
|
1739
|
+
this_colnames = []
|
|
1740
|
+
for i in range(0, depth + 1):
|
|
1741
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1742
|
+
colnames.append(this_colnames)
|
|
1743
|
+
result.append(metal_ac)
|
|
1744
|
+
if flag_name:
|
|
1745
|
+
results_dictionary = {'colnames': colnames, 'results_f_all': result}
|
|
1746
|
+
else:
|
|
1747
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1748
|
+
return results_dictionary
|
|
1749
|
+
|
|
1750
|
+
|
|
1751
|
+
def generate_full_complex_coulomb_autocorrelations(mol, loud,
|
|
1752
|
+
depth=3, oct=True,
|
|
1753
|
+
flag_name=False, modifier=False,
|
|
1754
|
+
use_dist=False, transition_metals_only=True):
|
|
1755
|
+
result = list()
|
|
1756
|
+
colnames = []
|
|
1757
|
+
# allowed_strings = ['ident', 'topology', 'bondvalence', 'valenceelectron', 'bondvalence_devi', 'bodavrg', 'bodstd',
|
|
1758
|
+
# 'charge']
|
|
1759
|
+
# labels_strings = ['I', 'T', 'BV', 'VE', 'BVD', "BODavrg", "BODstd", "Ch"]
|
|
1760
|
+
allowed_strings = ['ident', 'topology', 'group_number', "num_bonds"]
|
|
1761
|
+
labels_strings = ['I', 'T', 'Gval', "NumB"]
|
|
1762
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1763
|
+
metal_ac = full_autocorrelation(mol, properties, depth,
|
|
1764
|
+
oct=oct, modifier=modifier,
|
|
1765
|
+
use_dist=use_dist,
|
|
1766
|
+
transition_metals_only=transition_metals_only)
|
|
1767
|
+
this_colnames = []
|
|
1768
|
+
for i in range(0, depth + 1):
|
|
1769
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1770
|
+
colnames.append(this_colnames)
|
|
1771
|
+
result.append(metal_ac)
|
|
1772
|
+
if flag_name:
|
|
1773
|
+
results_dictionary = {'colnames': colnames, 'results_f_all': result}
|
|
1774
|
+
else:
|
|
1775
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1776
|
+
return results_dictionary
|
|
1777
|
+
|
|
1778
|
+
|
|
1779
|
+
def generate_full_complex_autocorrelation_derivatives(mol, loud, depth=4, oct=True, flag_name=False,
|
|
1780
|
+
modifier=False, NumB=False, Gval=False):
|
|
1781
|
+
result = None
|
|
1782
|
+
colnames = []
|
|
1783
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1784
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1785
|
+
if Gval:
|
|
1786
|
+
allowed_strings += ['group_number']
|
|
1787
|
+
labels_strings += ['Gval']
|
|
1788
|
+
if NumB:
|
|
1789
|
+
allowed_strings += ["num_bonds"]
|
|
1790
|
+
labels_strings += ["NumB"]
|
|
1791
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1792
|
+
f_ac_der = full_autocorrelation_derivative(mol, properties, depth, oct=oct, modifier=modifier)
|
|
1793
|
+
for i in range(0, depth + 1):
|
|
1794
|
+
colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
|
|
1795
|
+
range(0, mol.natoms)])
|
|
1796
|
+
if result is None:
|
|
1797
|
+
result = f_ac_der
|
|
1798
|
+
else:
|
|
1799
|
+
result = np.row_stack([result, f_ac_der])
|
|
1800
|
+
if flag_name:
|
|
1801
|
+
results_dictionary = {'colnames': colnames, 'results_f_all': result}
|
|
1802
|
+
else:
|
|
1803
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1804
|
+
return results_dictionary
|
|
1805
|
+
|
|
1806
|
+
|
|
1807
|
+
def generate_atomonly_autocorrelations(mol, atomIdx, loud, depth=4, oct=True, NumB=False, Gval=False, polarizability=False):
|
|
1808
|
+
# # this function gets autocorrelations for a molecule starting
|
|
1809
|
+
# # in one single atom only
|
|
1810
|
+
# Inputs:
|
|
1811
|
+
# mol - mol3D class
|
|
1812
|
+
# atomIdx - int, index of atom3D class; or list of indices
|
|
1813
|
+
# loud - bool, print output
|
|
1814
|
+
result = list()
|
|
1815
|
+
colnames = []
|
|
1816
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1817
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1818
|
+
if Gval:
|
|
1819
|
+
allowed_strings += ['group_number']
|
|
1820
|
+
labels_strings += ['Gval']
|
|
1821
|
+
if NumB:
|
|
1822
|
+
allowed_strings += ["num_bonds"]
|
|
1823
|
+
labels_strings += ["NumB"]
|
|
1824
|
+
if polarizability:
|
|
1825
|
+
allowed_strings += ['polarizability']
|
|
1826
|
+
labels_strings += ['alpha']
|
|
1827
|
+
# print('The selected connection type is ' + str(mol.getAtom(atomIdx).symbol()))
|
|
1828
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1829
|
+
atom_only_ac = atom_only_autocorrelation(mol, properties, depth, atomIdx, oct=oct)
|
|
1830
|
+
this_colnames = []
|
|
1831
|
+
for i in range(0, depth + 1):
|
|
1832
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1833
|
+
colnames.append(this_colnames)
|
|
1834
|
+
result.append(atom_only_ac)
|
|
1835
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1836
|
+
return results_dictionary
|
|
1837
|
+
|
|
1838
|
+
|
|
1839
|
+
def generate_atomonly_autocorrelation_derivatives(mol, atomIdx, loud, depth=4, oct=True, NumB=False, Gval=False):
|
|
1840
|
+
# # this function gets the d/dx for autocorrelations for a molecule starting
|
|
1841
|
+
# # in one single atom only
|
|
1842
|
+
# Inputs:
|
|
1843
|
+
# mol - mol3D class
|
|
1844
|
+
# atomIdx - int, index of atom3D class
|
|
1845
|
+
# loud - bool, print output
|
|
1846
|
+
result = None
|
|
1847
|
+
colnames = []
|
|
1848
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1849
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1850
|
+
if Gval:
|
|
1851
|
+
allowed_strings += ['group_number']
|
|
1852
|
+
labels_strings += ['Gval']
|
|
1853
|
+
if NumB:
|
|
1854
|
+
allowed_strings += ["num_bonds"]
|
|
1855
|
+
labels_strings += ["NumB"]
|
|
1856
|
+
# print('The selected connection type is ' + str(mol.getAtom(atomIdx).symbol()))
|
|
1857
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1858
|
+
atom_only_ac = atom_only_autocorrelation_derivative(mol, properties, depth, atomIdx, oct=oct)
|
|
1859
|
+
for i in range(0, depth + 1):
|
|
1860
|
+
colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
|
|
1861
|
+
range(0, mol.natoms)])
|
|
1862
|
+
if result is None:
|
|
1863
|
+
result = atom_only_ac
|
|
1864
|
+
else:
|
|
1865
|
+
result = np.row_stack([result, atom_only_ac])
|
|
1866
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1867
|
+
return results_dictionary
|
|
1868
|
+
|
|
1869
|
+
|
|
1870
|
+
def generate_atomonly_deltametrics(mol, atomIdx, loud, depth=4, oct=True, NumB=False, Gval=False, polarizability=False):
|
|
1871
|
+
# # this function gets deltametrics for a molecule starting
|
|
1872
|
+
# # in one single atom only
|
|
1873
|
+
# Inputs:
|
|
1874
|
+
# mol - mol3D class
|
|
1875
|
+
# atomIdx - int, index of atom3D class
|
|
1876
|
+
# loud - bool, print output
|
|
1877
|
+
result = list()
|
|
1878
|
+
colnames = []
|
|
1879
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1880
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1881
|
+
if Gval:
|
|
1882
|
+
allowed_strings += ['group_number']
|
|
1883
|
+
labels_strings += ['Gval']
|
|
1884
|
+
if NumB:
|
|
1885
|
+
allowed_strings += ["num_bonds"]
|
|
1886
|
+
labels_strings += ["NumB"]
|
|
1887
|
+
if polarizability:
|
|
1888
|
+
allowed_strings += ["polarizability"]
|
|
1889
|
+
labels_strings += ["alpha"]
|
|
1890
|
+
# print('The selected connection type is ' + str(mol.getAtom(atomIdx).symbol()))
|
|
1891
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1892
|
+
atom_only_ac = atom_only_deltametric(mol, properties, depth, atomIdx, oct=oct)
|
|
1893
|
+
this_colnames = []
|
|
1894
|
+
for i in range(0, depth + 1):
|
|
1895
|
+
this_colnames.append(labels_strings[ii] + '-' + str(i))
|
|
1896
|
+
colnames.append(this_colnames)
|
|
1897
|
+
result.append(atom_only_ac)
|
|
1898
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1899
|
+
return results_dictionary
|
|
1900
|
+
|
|
1901
|
+
|
|
1902
|
+
def generate_atomonly_deltametric_derivatives(mol, atomIdx, loud, depth=4, oct=True, NumB=False, Gval=False):
|
|
1903
|
+
# # this function gets deltametrics for a molecule starting
|
|
1904
|
+
# # in one single atom only
|
|
1905
|
+
# Inputs:
|
|
1906
|
+
# mol - mol3D class
|
|
1907
|
+
# atomIdx - int, index of atom3D class
|
|
1908
|
+
# loud - bool, print output
|
|
1909
|
+
result = None
|
|
1910
|
+
colnames = []
|
|
1911
|
+
allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
|
|
1912
|
+
labels_strings = ['chi', 'Z', 'I', 'T', 'S']
|
|
1913
|
+
if Gval:
|
|
1914
|
+
allowed_strings += ['group_number']
|
|
1915
|
+
labels_strings += ['Gval']
|
|
1916
|
+
if NumB:
|
|
1917
|
+
allowed_strings += ["num_bonds"]
|
|
1918
|
+
labels_strings += ["NumB"]
|
|
1919
|
+
# print('The selected connection type is ' + str(mol.getAtom(atomIdx).symbol()))
|
|
1920
|
+
for ii, properties in enumerate(allowed_strings):
|
|
1921
|
+
atom_only_ac_der = atom_only_deltametric_derivative(mol, properties, depth, atomIdx, oct=oct)
|
|
1922
|
+
for i in range(0, depth + 1):
|
|
1923
|
+
colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
|
|
1924
|
+
range(0, mol.natoms)])
|
|
1925
|
+
if result is None:
|
|
1926
|
+
result = atom_only_ac_der
|
|
1927
|
+
else:
|
|
1928
|
+
result = np.row_stack([result, atom_only_ac_der])
|
|
1929
|
+
results_dictionary = {'colnames': colnames, 'results': result}
|
|
1930
|
+
return results_dictionary
|