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,1224 @@
|
|
|
1
|
+
# @file geometry.py
|
|
2
|
+
# Contains many useful 3D Euclidean geometric manipulation routines.
|
|
3
|
+
#
|
|
4
|
+
# Unless otherwise stated, all "points" refer to 3-element lists.
|
|
5
|
+
#
|
|
6
|
+
# Written by Kulik Group
|
|
7
|
+
#
|
|
8
|
+
# Department of Chemical Engineering, MIT
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
from typing import List
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def norm(u):
|
|
15
|
+
"""Get euclidean norm of vector.
|
|
16
|
+
|
|
17
|
+
Parameters
|
|
18
|
+
----------
|
|
19
|
+
u : list
|
|
20
|
+
Vector of interest.
|
|
21
|
+
|
|
22
|
+
Returns
|
|
23
|
+
-------
|
|
24
|
+
norm : float
|
|
25
|
+
Norm of u.
|
|
26
|
+
|
|
27
|
+
"""
|
|
28
|
+
d = 0.0
|
|
29
|
+
for u0 in u:
|
|
30
|
+
d += (u0 * u0)
|
|
31
|
+
d = np.sqrt(d)
|
|
32
|
+
return d
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def normalize(u):
|
|
36
|
+
"""Normalize a vector.
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
u : list
|
|
41
|
+
Vector of interest.
|
|
42
|
+
|
|
43
|
+
Returns
|
|
44
|
+
-------
|
|
45
|
+
norm_vect : list
|
|
46
|
+
Normalized vector.
|
|
47
|
+
|
|
48
|
+
"""
|
|
49
|
+
d = norm(u)
|
|
50
|
+
un = []
|
|
51
|
+
if d > 1.0e-13:
|
|
52
|
+
[un.append(ui / d) for ui in u]
|
|
53
|
+
return un
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def distance(r1, r2):
|
|
57
|
+
"""Euclidean distance between points.
|
|
58
|
+
|
|
59
|
+
Parameters
|
|
60
|
+
----------
|
|
61
|
+
r1 : list
|
|
62
|
+
Coordinates of point 1.
|
|
63
|
+
r2 : list
|
|
64
|
+
Coordinates of point 2.
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
dist : float
|
|
69
|
+
Euclidean distance between points 1 and 2.
|
|
70
|
+
|
|
71
|
+
"""
|
|
72
|
+
dx = r1[0] - r2[0]
|
|
73
|
+
dy = r1[1] - r2[1]
|
|
74
|
+
dz = r1[2] - r2[2]
|
|
75
|
+
d = np.sqrt(dx ** 2 + dy ** 2 + dz ** 2)
|
|
76
|
+
return d
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def vecdiff(r1, r2):
|
|
80
|
+
"""Element-wise vector difference
|
|
81
|
+
|
|
82
|
+
Parameters
|
|
83
|
+
----------
|
|
84
|
+
r1 : list
|
|
85
|
+
Vector 1.
|
|
86
|
+
r2 : list
|
|
87
|
+
Vector 2.
|
|
88
|
+
|
|
89
|
+
Returns
|
|
90
|
+
-------
|
|
91
|
+
diff : list
|
|
92
|
+
Vector difference between points 1 and 2.
|
|
93
|
+
|
|
94
|
+
"""
|
|
95
|
+
dr = [a - b for a, b in zip(r1, r2)]
|
|
96
|
+
return dr
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def midpt(r1, r2):
|
|
100
|
+
"""Vector midpoint.
|
|
101
|
+
|
|
102
|
+
Parameters
|
|
103
|
+
----------
|
|
104
|
+
r1 : list
|
|
105
|
+
Vector 1.
|
|
106
|
+
r2 : list
|
|
107
|
+
Vector 2.
|
|
108
|
+
|
|
109
|
+
Returns
|
|
110
|
+
-------
|
|
111
|
+
mid : list
|
|
112
|
+
Midpoint between vector 1 and 2.
|
|
113
|
+
|
|
114
|
+
"""
|
|
115
|
+
m = [0.5 * (a + b) for a, b in zip(r1, r2)]
|
|
116
|
+
return m
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def checkcolinear(r1, r2, r3):
|
|
120
|
+
"""Checks if three points are collinear.
|
|
121
|
+
|
|
122
|
+
Parameters
|
|
123
|
+
----------
|
|
124
|
+
r1 : list
|
|
125
|
+
Coordinates of point 1.
|
|
126
|
+
r2 : list
|
|
127
|
+
Coordinates of point 2.
|
|
128
|
+
r3 : list
|
|
129
|
+
Coordinates of point 3.
|
|
130
|
+
|
|
131
|
+
Returns
|
|
132
|
+
-------
|
|
133
|
+
collinear_flag : bool
|
|
134
|
+
Flag for collinearity. True if collinear.
|
|
135
|
+
|
|
136
|
+
"""
|
|
137
|
+
dr1 = vecdiff(r2, r1)
|
|
138
|
+
dr2 = vecdiff(r1, r3)
|
|
139
|
+
dd = np.cross(np.array(dr1), np.array(dr2))
|
|
140
|
+
if norm(dd) < 1.e-01:
|
|
141
|
+
return True
|
|
142
|
+
else:
|
|
143
|
+
return False
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def checkplanar(r1, r2, r3, r4):
|
|
147
|
+
"""Checks if four points are coplanar.
|
|
148
|
+
|
|
149
|
+
Parameters
|
|
150
|
+
----------
|
|
151
|
+
r1 : list
|
|
152
|
+
Coordinates of point 1.
|
|
153
|
+
r2 : list
|
|
154
|
+
Coordinates of point 2.
|
|
155
|
+
r3 : list
|
|
156
|
+
Coordinates of point 3.
|
|
157
|
+
r4 : list
|
|
158
|
+
Coordinates of point 4.
|
|
159
|
+
|
|
160
|
+
Returns
|
|
161
|
+
-------
|
|
162
|
+
coplanar_flag : bool
|
|
163
|
+
Flag for coplanarity. True if coplanarity.
|
|
164
|
+
|
|
165
|
+
"""
|
|
166
|
+
r31 = vecdiff(r3, r1)
|
|
167
|
+
r21 = vecdiff(r2, r1)
|
|
168
|
+
r43 = vecdiff(r4, r3)
|
|
169
|
+
cr0 = np.cross(np.array(r21), np.array(r43))
|
|
170
|
+
dd = np.dot(r31, cr0)
|
|
171
|
+
if abs(dd) < 1.e-1:
|
|
172
|
+
return True
|
|
173
|
+
else:
|
|
174
|
+
return False
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def vecangle(r1, r2):
|
|
178
|
+
"""Computes angle between two vectors.
|
|
179
|
+
|
|
180
|
+
Parameters
|
|
181
|
+
----------
|
|
182
|
+
r1 : list
|
|
183
|
+
Vector 1.
|
|
184
|
+
r2 : list
|
|
185
|
+
Vector 2.
|
|
186
|
+
|
|
187
|
+
Returns
|
|
188
|
+
-------
|
|
189
|
+
theta : float
|
|
190
|
+
Angle between two vectors in degrees.
|
|
191
|
+
|
|
192
|
+
"""
|
|
193
|
+
if (norm(r2) * norm(r1) > 1e-16):
|
|
194
|
+
inner_prod = np.round(np.dot(r2, r1) / (norm(r2) * norm(r1)), 10)
|
|
195
|
+
theta = 180 * np.arccos(inner_prod) / np.pi
|
|
196
|
+
else:
|
|
197
|
+
theta = 0.0
|
|
198
|
+
return theta
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def getPointu(Rr, dist, u):
|
|
202
|
+
"""Gets point given reference point, direction vector and distance.
|
|
203
|
+
|
|
204
|
+
Parameters
|
|
205
|
+
----------
|
|
206
|
+
Rr : list
|
|
207
|
+
Reference point.
|
|
208
|
+
dist : float
|
|
209
|
+
Distance in angstroms.
|
|
210
|
+
u : list
|
|
211
|
+
Direction vector.
|
|
212
|
+
|
|
213
|
+
Returns
|
|
214
|
+
-------
|
|
215
|
+
P : list
|
|
216
|
+
Final point.
|
|
217
|
+
|
|
218
|
+
"""
|
|
219
|
+
# get float bond length
|
|
220
|
+
bl = float(dist)
|
|
221
|
+
# get unit vector through line r = r0 + t*u
|
|
222
|
+
t = bl / norm(u) # get t as t=bl/norm(r1-r0)
|
|
223
|
+
# get point
|
|
224
|
+
P = [0, 0, 0]
|
|
225
|
+
P[0] = t * u[0] + Rr[0]
|
|
226
|
+
P[1] = t * u[1] + Rr[1]
|
|
227
|
+
P[2] = t * u[2] + Rr[2]
|
|
228
|
+
return P
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def rotation_params(r0, r1, r2):
|
|
232
|
+
"""Gets angle between three points (r10 and r21) and the normal vector to the plane containing three points.
|
|
233
|
+
|
|
234
|
+
Parameters
|
|
235
|
+
----------
|
|
236
|
+
r0 : list
|
|
237
|
+
Coordinates for point 1.
|
|
238
|
+
r1 : list
|
|
239
|
+
Coordinates for point 2.
|
|
240
|
+
r2 : list
|
|
241
|
+
Coordinates for point 3.
|
|
242
|
+
|
|
243
|
+
Returns
|
|
244
|
+
-------
|
|
245
|
+
theta : float
|
|
246
|
+
Angle in units of degrees.
|
|
247
|
+
u : list
|
|
248
|
+
Normal vector.
|
|
249
|
+
|
|
250
|
+
"""
|
|
251
|
+
r10 = [a - b for a, b in zip(r1, r0)]
|
|
252
|
+
r21 = [a - b for a, b in zip(r2, r1)]
|
|
253
|
+
# print('r10 is ' +str(r10) )
|
|
254
|
+
# print('r21 is ' +str(r21) )
|
|
255
|
+
# angle between r10 and r21
|
|
256
|
+
# print('arg to arcos is ' +str(np.dot(r21,r10)/(norm(r21)*norm(r10))) )
|
|
257
|
+
arg = np.dot(r21, r10) / (norm(r21) * norm(r10))
|
|
258
|
+
if (norm(r21) * norm(r10) > 1e-16):
|
|
259
|
+
if arg < 0:
|
|
260
|
+
theta = 180 * np.arccos(max(-1, arg)) / np.pi
|
|
261
|
+
else:
|
|
262
|
+
theta = 180 * np.arccos(min(1, arg)) / np.pi
|
|
263
|
+
else:
|
|
264
|
+
theta = 0.0
|
|
265
|
+
# get normal vector to plane r0 r1 r2
|
|
266
|
+
u = np.cross(r21, r10)
|
|
267
|
+
# check for collinear case
|
|
268
|
+
if norm(u) < 1e-16:
|
|
269
|
+
# pick random perpendicular vector
|
|
270
|
+
if (abs(r21[0]) > 1e-16):
|
|
271
|
+
u = [(-r21[1] - r21[2]) / r21[0], 1, 1]
|
|
272
|
+
elif (abs(r21[1]) > 1e-16):
|
|
273
|
+
u = [1, (-r21[0] - r21[2]) / r21[1], 1]
|
|
274
|
+
elif (abs(r21[2]) > 1e-16):
|
|
275
|
+
u = [1, 1, (-r21[0] - r21[1]) / r21[2]]
|
|
276
|
+
return theta, u
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def dihedral(mol, idx1, idx2, idx3, idx4):
|
|
280
|
+
"""Computes dihedral angle for a set of four atom indices.
|
|
281
|
+
|
|
282
|
+
Parameters
|
|
283
|
+
----------
|
|
284
|
+
mol0 : mol3D
|
|
285
|
+
mol3D class instance of molecule for which we compute dihedral angle.
|
|
286
|
+
idx1 : int
|
|
287
|
+
Index of atom 1.
|
|
288
|
+
idx2 : int
|
|
289
|
+
Index of atom 2.
|
|
290
|
+
idx3 : int
|
|
291
|
+
Index of atom 3.
|
|
292
|
+
idx4 : int
|
|
293
|
+
Index of atom 4.
|
|
294
|
+
"""
|
|
295
|
+
|
|
296
|
+
r1 = mol.getAtom(idx1).coords()
|
|
297
|
+
r2 = mol.getAtom(idx2).coords()
|
|
298
|
+
r3 = mol.getAtom(idx3).coords()
|
|
299
|
+
r4 = mol.getAtom(idx4).coords()
|
|
300
|
+
|
|
301
|
+
v1 = np.array(r2)-np.array(r1) # vector formed between atoms 1 and 2
|
|
302
|
+
v2 = np.array(r3)-np.array(r2) # vector formed between atoms 2 and 3
|
|
303
|
+
v3 = np.array(r4)-np.array(r3) # vector formed between atoms 3 and 4
|
|
304
|
+
|
|
305
|
+
v1_x_v2 = np.cross(v1, v2) # cross product of v1 and v2
|
|
306
|
+
v2_x_v3 = np.cross(v2, v3) # cross product of v2 and v3
|
|
307
|
+
|
|
308
|
+
normal_1 = v1_x_v2/(np.linalg.norm(v1_x_v2)) # normal to the plane formed by 1,2,3
|
|
309
|
+
normal_2 = v2_x_v3/(np.linalg.norm(v2_x_v3)) # normal to the plane formed by 2,3,4
|
|
310
|
+
|
|
311
|
+
unit_1 = v2/(np.linalg.norm(v2))
|
|
312
|
+
unit_2 = np.cross(unit_1, normal_2)
|
|
313
|
+
|
|
314
|
+
cos_angle = np.dot(normal_1, normal_2)
|
|
315
|
+
sine_angle = np.dot(normal_1, unit_2)
|
|
316
|
+
|
|
317
|
+
dihedral_angle = round(np.degrees(-np.arctan2(sine_angle, cos_angle)), 3)
|
|
318
|
+
return dihedral_angle
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def kabsch(mol0, mol1):
|
|
322
|
+
"""Aligns (translates and rotates) two molecules to minimize RMSD using the Kabsch algorithm.
|
|
323
|
+
|
|
324
|
+
Parameters
|
|
325
|
+
----------
|
|
326
|
+
mol0 : mol3D
|
|
327
|
+
mol3D class instance of molecule to be aligned. Will be translated and rotated.
|
|
328
|
+
mol1 : mol3D
|
|
329
|
+
mol3D class instance of reference molecule. Will be translated.
|
|
330
|
+
|
|
331
|
+
Returns
|
|
332
|
+
-------
|
|
333
|
+
mol0 : mol3D
|
|
334
|
+
mol3D class instance of aligned molecule.
|
|
335
|
+
U : list
|
|
336
|
+
Rotation matrix as list of lists.
|
|
337
|
+
d0 : list
|
|
338
|
+
Translation vector for mol0.
|
|
339
|
+
d1 : list
|
|
340
|
+
Translation vector for mol1.
|
|
341
|
+
|
|
342
|
+
"""
|
|
343
|
+
if (mol0.getNumAtoms() != mol1.getNumAtoms()):
|
|
344
|
+
print(f'issue: {mol0.getNumAtoms()} != {mol1.getNumAtoms()}')
|
|
345
|
+
raise ValueError('The two molecules should have the same number of atoms.')
|
|
346
|
+
|
|
347
|
+
# translate to align centroids with origin
|
|
348
|
+
mol0, d0 = setPdistance(mol0, mol0.centersym(), [0, 0, 0], 0)
|
|
349
|
+
mol1, d1 = setPdistance(mol1, mol1.centersym(), [0, 0, 0], 0)
|
|
350
|
+
# get coordinates and matrices P,Q
|
|
351
|
+
P, Q = [], []
|
|
352
|
+
for atom0, atom1 in zip(mol0.getAtoms(), mol1.getAtoms()):
|
|
353
|
+
P.append(atom0.coords())
|
|
354
|
+
Q.append(atom1.coords())
|
|
355
|
+
# Computation of the covariance matrix
|
|
356
|
+
C = np.dot(np.transpose(P), Q)
|
|
357
|
+
# Computation of the optimal rotation matrix
|
|
358
|
+
# This can be done using singular value decomposition (SVD)
|
|
359
|
+
# Getting the sign of the det(V)*(W) to decide
|
|
360
|
+
# whether we need to correct our rotation matrix to ensure a
|
|
361
|
+
# right-handed coordinate system.
|
|
362
|
+
# And finally calculating the optimal rotation matrix U
|
|
363
|
+
# see http://en.wikipedia.org/wiki/Kabsch_algorithm
|
|
364
|
+
V, S, W = np.linalg.svd(C)
|
|
365
|
+
d = (np.linalg.det(V) * np.linalg.det(W)) < 0.0
|
|
366
|
+
# Create Rotation matrix U
|
|
367
|
+
if d:
|
|
368
|
+
S[-1] = -S[-1]
|
|
369
|
+
V[:, -1] = -V[:, -1]
|
|
370
|
+
U = np.dot(V, W)
|
|
371
|
+
# Rotate P
|
|
372
|
+
P = np.dot(P, U)
|
|
373
|
+
# write back coordinates
|
|
374
|
+
for i, atom in enumerate(mol0.getAtoms()):
|
|
375
|
+
atom.setcoords(P[i])
|
|
376
|
+
return mol0, U.tolist(), d0, d1
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def ReflectPlane(u, r, Rp):
|
|
380
|
+
"""Reflects point about plane defined by its normal vector and a point on the plane
|
|
381
|
+
|
|
382
|
+
Parameters
|
|
383
|
+
----------
|
|
384
|
+
u : list
|
|
385
|
+
Normal vector to plane.
|
|
386
|
+
r : list
|
|
387
|
+
Point to be reflected.
|
|
388
|
+
Rp : list
|
|
389
|
+
Reference point on plane.
|
|
390
|
+
|
|
391
|
+
Returns
|
|
392
|
+
-------
|
|
393
|
+
rn : list
|
|
394
|
+
Reflected point.
|
|
395
|
+
|
|
396
|
+
"""
|
|
397
|
+
un = norm(u)
|
|
398
|
+
if (un > 1e-16):
|
|
399
|
+
u[0] = u[0] / un
|
|
400
|
+
u[1] = u[1] / un
|
|
401
|
+
u[2] = u[2] / un
|
|
402
|
+
# construct augmented vector rr = [r;1]
|
|
403
|
+
d = -u[0] * Rp[0] - u[1] * Rp[1] - u[2] * Rp[2]
|
|
404
|
+
# reflection matrix
|
|
405
|
+
R = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
|
|
406
|
+
rn = [0, 0, 0]
|
|
407
|
+
R[0][0] = 1 - 2 * u[0] * u[0]
|
|
408
|
+
R[0][1] = -2 * u[0] * u[1]
|
|
409
|
+
R[0][2] = -2 * u[0] * u[2]
|
|
410
|
+
R[0][3] = -2 * u[0] * d
|
|
411
|
+
R[1][0] = -2 * u[1] * u[0]
|
|
412
|
+
R[1][1] = 1 - 2 * u[1] * u[1]
|
|
413
|
+
R[1][2] = -2 * u[1] * u[2]
|
|
414
|
+
R[1][3] = -2 * u[1] * d
|
|
415
|
+
R[2][0] = -2 * u[2] * u[0]
|
|
416
|
+
R[2][1] = -2 * u[1] * u[2]
|
|
417
|
+
R[2][2] = 1 - 2 * u[2] * u[2]
|
|
418
|
+
R[2][3] = -2 * u[2] * d
|
|
419
|
+
R[3][3] = 1
|
|
420
|
+
# get new point
|
|
421
|
+
rn[0] = R[0][0] * r[0] + R[0][1] * r[1] + R[0][2] * r[2] + R[0][3]
|
|
422
|
+
rn[1] = R[1][0] * r[0] + R[1][1] * r[1] + R[1][2] * r[2] + R[1][3]
|
|
423
|
+
rn[2] = R[2][0] * r[0] + R[2][1] * r[1] + R[2][2] * r[2] + R[2][3]
|
|
424
|
+
return rn
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
def PointRotateAxis(u, rp, r, theta):
|
|
428
|
+
"""Rotates point about axis defined by direction vector and point on axis. Theta units in radians.
|
|
429
|
+
|
|
430
|
+
Parameters
|
|
431
|
+
----------
|
|
432
|
+
u : list
|
|
433
|
+
Direction vector of axis.
|
|
434
|
+
rp : list
|
|
435
|
+
Reference point along axis
|
|
436
|
+
r : list
|
|
437
|
+
Point to be rotated
|
|
438
|
+
theta : float
|
|
439
|
+
Angle of rotation in RADIANS.
|
|
440
|
+
|
|
441
|
+
Returns
|
|
442
|
+
-------
|
|
443
|
+
rotated : list
|
|
444
|
+
Rotated point.
|
|
445
|
+
|
|
446
|
+
"""
|
|
447
|
+
# construct augmented vector rr = [r;1]
|
|
448
|
+
rr = r
|
|
449
|
+
rr.append(1)
|
|
450
|
+
# rotation matrix about arbitrary line through rp
|
|
451
|
+
R = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
|
|
452
|
+
rn = [0, 0, 0]
|
|
453
|
+
R[0][0] = np.cos(theta) + u[0] ** 2 * (1 - np.cos(theta))
|
|
454
|
+
R[0][1] = u[0] * u[1] * (1 - np.cos(theta)) - u[2] * np.sin(theta)
|
|
455
|
+
R[0][2] = u[0] * u[2] * (1 - np.cos(theta)) + u[1] * np.sin(theta)
|
|
456
|
+
R[0][3] = (rp[0] * (u[1] ** 2 + u[2] ** 2) - u[0] *
|
|
457
|
+
(rp[1] * u[1] + rp[2] * u[2])) * (1 - np.cos(theta))
|
|
458
|
+
R[0][3] += (rp[1] * u[2] - rp[2] * u[1]) * np.sin(theta)
|
|
459
|
+
R[1][0] = u[1] * u[0] * (1 - np.cos(theta)) + u[2] * np.sin(theta)
|
|
460
|
+
R[1][1] = np.cos(theta) + u[1] ** 2 * (1 - np.cos(theta))
|
|
461
|
+
R[1][2] = u[1] * u[2] * (1 - np.cos(theta)) - u[0] * np.sin(theta)
|
|
462
|
+
R[1][3] = (rp[1] * (u[0] ** 2 + u[2] ** 2) - u[1] *
|
|
463
|
+
(rp[0] * u[0] + rp[2] * u[2])) * (1 - np.cos(theta))
|
|
464
|
+
R[1][3] += (rp[2] * u[0] - rp[0] * u[2]) * np.sin(theta)
|
|
465
|
+
R[2][0] = u[2] * u[0] * (1 - np.cos(theta)) - u[1] * np.sin(theta)
|
|
466
|
+
R[2][1] = u[2] * u[1] * (1 - np.cos(theta)) + u[0] * np.sin(theta)
|
|
467
|
+
R[2][2] = np.cos(theta) + u[2] ** 2 * (1 - np.cos(theta))
|
|
468
|
+
R[2][3] = (rp[2] * (u[0] ** 2 + u[1] ** 2) - u[2] *
|
|
469
|
+
(rp[0] * u[0] + rp[1] * u[1])) * (1 - np.cos(theta))
|
|
470
|
+
R[2][3] += (rp[0] * u[1] - rp[1] * u[0]) * np.sin(theta)
|
|
471
|
+
R[3][3] = 1
|
|
472
|
+
# get new point
|
|
473
|
+
rn[0] = R[0][0] * r[0] + R[0][1] * r[1] + R[0][2] * r[2] + R[0][3]
|
|
474
|
+
rn[1] = R[1][0] * r[0] + R[1][1] * r[1] + R[1][2] * r[2] + R[1][3]
|
|
475
|
+
rn[2] = R[2][0] * r[0] + R[2][1] * r[1] + R[2][2] * r[2] + R[2][3]
|
|
476
|
+
return rn
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
def PointRotateMat(r, R):
|
|
480
|
+
"""Rotates point using arbitrary 3x3 rotation matrix
|
|
481
|
+
|
|
482
|
+
Parameters
|
|
483
|
+
----------
|
|
484
|
+
r : list
|
|
485
|
+
Point to be rotated
|
|
486
|
+
R : list
|
|
487
|
+
List of lists for 3 by 3 rotation matrix.
|
|
488
|
+
|
|
489
|
+
Returns
|
|
490
|
+
-------
|
|
491
|
+
rotated : list
|
|
492
|
+
Rotated point.
|
|
493
|
+
|
|
494
|
+
"""
|
|
495
|
+
rn = [0, 0, 0]
|
|
496
|
+
rn[0] = R[0][0] * r[0] + R[1][0] * r[1] + R[2][0] * r[2]
|
|
497
|
+
rn[1] = R[0][1] * r[0] + R[1][1] * r[1] + R[2][1] * r[2]
|
|
498
|
+
rn[2] = R[0][2] * r[0] + R[1][2] * r[1] + R[2][2] * r[2]
|
|
499
|
+
return rn
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
def PointTranslateSph(Rp, p0, D) -> List[float]:
|
|
503
|
+
"""Translates point in spherical coordinates.
|
|
504
|
+
|
|
505
|
+
Parameters
|
|
506
|
+
----------
|
|
507
|
+
Rp : list
|
|
508
|
+
Origin of sphere
|
|
509
|
+
p0 : list
|
|
510
|
+
Point to be translated
|
|
511
|
+
D : list
|
|
512
|
+
[final radial distance, change in polar phi, change in azimuthal theta]. Angles in RADIANS.
|
|
513
|
+
|
|
514
|
+
Returns
|
|
515
|
+
-------
|
|
516
|
+
p : list
|
|
517
|
+
Translated point.
|
|
518
|
+
|
|
519
|
+
"""
|
|
520
|
+
# translate to origin
|
|
521
|
+
ps = [0., 0., 0.]
|
|
522
|
+
ps[0] = p0[0] - Rp[0]
|
|
523
|
+
ps[1] = p0[1] - Rp[1]
|
|
524
|
+
ps[2] = p0[2] - Rp[2]
|
|
525
|
+
# get initial spherical coords
|
|
526
|
+
r0 = norm(ps)
|
|
527
|
+
if (r0 < 1e-16):
|
|
528
|
+
phi0 = 0.5 * np.pi
|
|
529
|
+
theta0 = 0.
|
|
530
|
+
else:
|
|
531
|
+
phi0 = np.arccos(ps[2] / r0) # z/r
|
|
532
|
+
theta0 = np.arctan2(ps[1], ps[0]) # y/x
|
|
533
|
+
# get new point
|
|
534
|
+
p = [0., 0., 0.]
|
|
535
|
+
p[0] = (D[0]) * np.sin(phi0 + D[2]) * np.cos(theta0 + D[1]) + Rp[0]
|
|
536
|
+
p[1] = (D[0]) * np.sin(phi0 + D[2]) * np.sin(theta0 + D[1]) + Rp[1]
|
|
537
|
+
p[2] = (D[0]) * np.cos(phi0 + D[2]) + Rp[2]
|
|
538
|
+
return p
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
def PointTranslateSphgivenphi(Rp, p0, D):
|
|
542
|
+
"""Translates point in spherical coordinates. Redundant with PointTranslateSph. Will be deprecated.
|
|
543
|
+
|
|
544
|
+
Parameters
|
|
545
|
+
----------
|
|
546
|
+
Rp : list
|
|
547
|
+
Origin of sphere
|
|
548
|
+
p0 : list
|
|
549
|
+
Point to be translated
|
|
550
|
+
D : list
|
|
551
|
+
[final radial distance, change in polar phi, change in azimuthal theta]. Angles in RADIANS.
|
|
552
|
+
|
|
553
|
+
Returns
|
|
554
|
+
-------
|
|
555
|
+
p : list
|
|
556
|
+
Translated point.
|
|
557
|
+
|
|
558
|
+
"""
|
|
559
|
+
# translate to origin
|
|
560
|
+
ps = [0, 0, 0]
|
|
561
|
+
ps[0] = p0[0] - Rp[0]
|
|
562
|
+
ps[1] = p0[1] - Rp[1]
|
|
563
|
+
ps[2] = p0[2] - Rp[2]
|
|
564
|
+
# get initial spherical coords
|
|
565
|
+
r0 = norm(ps)
|
|
566
|
+
if (r0 < 1e-16):
|
|
567
|
+
phi0 = 0.5 * np.pi
|
|
568
|
+
theta0 = 0
|
|
569
|
+
else:
|
|
570
|
+
phi0 = np.arccos(ps[2] / r0) # z/r
|
|
571
|
+
theta0 = np.arctan2(ps[1], ps[0]) # y/x
|
|
572
|
+
# get new point
|
|
573
|
+
p = [0, 0, 0]
|
|
574
|
+
p[0] = (D[0]) * np.sin(phi0 + D[1]) * np.cos(theta0) + Rp[0]
|
|
575
|
+
p[1] = (D[0]) * np.sin(phi0 + D[1]) * np.sin(theta0) + Rp[1]
|
|
576
|
+
p[2] = (D[0]) * np.cos(phi0 + D[1]) + Rp[2]
|
|
577
|
+
return p
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
def PointTranslateSphgivenr(Rp, p0, D, pref, r):
|
|
581
|
+
"""Translates point in spherical coordinates given R.
|
|
582
|
+
|
|
583
|
+
Parameters
|
|
584
|
+
----------
|
|
585
|
+
Rp : list
|
|
586
|
+
Origin of sphere
|
|
587
|
+
p0 : list
|
|
588
|
+
Point to be translated
|
|
589
|
+
D : list
|
|
590
|
+
[final radial distance, change in polar phi, change in azimuthal theta]. Angles in RADIANS.
|
|
591
|
+
pref : list
|
|
592
|
+
Coordinates of reference point.
|
|
593
|
+
r : float
|
|
594
|
+
Given radius.
|
|
595
|
+
|
|
596
|
+
Returns
|
|
597
|
+
-------
|
|
598
|
+
p : list
|
|
599
|
+
Translated point.
|
|
600
|
+
|
|
601
|
+
"""
|
|
602
|
+
# translate to origin
|
|
603
|
+
ps = [0, 0, 0]
|
|
604
|
+
ps[0] = p0[0] - Rp[0]
|
|
605
|
+
ps[1] = p0[1] - Rp[1]
|
|
606
|
+
ps[2] = p0[2] - Rp[2]
|
|
607
|
+
# get initial spherical coords
|
|
608
|
+
r0 = norm(ps)
|
|
609
|
+
if (r0 < 1e-16):
|
|
610
|
+
phi0 = 0.5 * np.pi
|
|
611
|
+
theta0 = 0
|
|
612
|
+
else:
|
|
613
|
+
phi0 = np.arccos(ps[2] / r0) # z/r
|
|
614
|
+
theta0 = np.arctan2(ps[1], ps[0]) # y/x
|
|
615
|
+
# get new point
|
|
616
|
+
p = [0, 0, 0]
|
|
617
|
+
r0 = 0
|
|
618
|
+
theta0 = 0
|
|
619
|
+
while abs(1 - r0 / r) > 0.01 and theta0 < 2 * np.pi:
|
|
620
|
+
p[0] = (D[0]) * np.sin(phi0 + D[1]) * np.cos(theta0) + Rp[0]
|
|
621
|
+
p[1] = (D[0]) * np.sin(phi0 + D[1]) * np.sin(theta0) + Rp[1]
|
|
622
|
+
p[2] = (D[0]) * np.cos(phi0 + D[1]) + Rp[2]
|
|
623
|
+
r0 = distance(p, pref)
|
|
624
|
+
theta0 += 0.01
|
|
625
|
+
return p
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
def PointTranslatetoPSph(Rp, p0, D):
|
|
629
|
+
"""Converts spherical translation vector into Cartesian translation vector
|
|
630
|
+
|
|
631
|
+
Parameters
|
|
632
|
+
----------
|
|
633
|
+
Rp : list
|
|
634
|
+
Origin of sphere
|
|
635
|
+
p0 : list
|
|
636
|
+
Point to be translated
|
|
637
|
+
D : list
|
|
638
|
+
[final radial distance, change in polar phi, change in azimuthal theta]. Angles in RADIANS.
|
|
639
|
+
|
|
640
|
+
Returns
|
|
641
|
+
-------
|
|
642
|
+
p : list
|
|
643
|
+
Translation vector
|
|
644
|
+
|
|
645
|
+
"""
|
|
646
|
+
# translate to origin
|
|
647
|
+
ps = [0, 0, 0]
|
|
648
|
+
ps[0] = p0[0] - Rp[0]
|
|
649
|
+
ps[1] = p0[1] - Rp[1]
|
|
650
|
+
ps[2] = p0[2] - Rp[2]
|
|
651
|
+
# get current spherical coords
|
|
652
|
+
r0 = norm(ps)
|
|
653
|
+
if (r0 < 1e-16):
|
|
654
|
+
phi0 = 0.5 * np.pi
|
|
655
|
+
theta0 = 0
|
|
656
|
+
else:
|
|
657
|
+
phi0 = np.arccos(ps[2] / r0) # z/r
|
|
658
|
+
theta0 = np.arctan2(ps[1], ps[0]) # y/x
|
|
659
|
+
# get translation vector
|
|
660
|
+
p = [0, 0, 0]
|
|
661
|
+
p[0] = D[0] * np.sin(phi0 + D[2]) * np.cos(theta0 + D[1])
|
|
662
|
+
p[1] = D[0] * np.sin(phi0 + D[2]) * np.sin(theta0 + D[1])
|
|
663
|
+
p[2] = D[0] * np.cos(phi0 + D[2])
|
|
664
|
+
return p
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
def PointRotateSph(Rp, p0, D):
|
|
668
|
+
"""Rotates point about Cartesian axes defined relative to given origin.
|
|
669
|
+
|
|
670
|
+
Parameters
|
|
671
|
+
----------
|
|
672
|
+
Rp : list
|
|
673
|
+
Cartesian origin
|
|
674
|
+
p0 : list
|
|
675
|
+
Point to be rotated
|
|
676
|
+
D : list
|
|
677
|
+
[theta-x, theta-y, theta-z] in RADIANS
|
|
678
|
+
|
|
679
|
+
Returns
|
|
680
|
+
-------
|
|
681
|
+
p : list
|
|
682
|
+
Rotated point
|
|
683
|
+
|
|
684
|
+
"""
|
|
685
|
+
# translate to origin (reference)
|
|
686
|
+
ps = [0, 0, 0]
|
|
687
|
+
ps[0] = p0[0] - Rp[0]
|
|
688
|
+
ps[1] = p0[1] - Rp[1]
|
|
689
|
+
ps[2] = p0[2] - Rp[2]
|
|
690
|
+
# build 3D rotation matrices about x,y,z axes
|
|
691
|
+
Mx = [[1, 0, 0], [0, np.cos(D[0]), -np.sin(D[0])], [0, np.sin(D[0]), np.cos(D[0])]]
|
|
692
|
+
My = [[np.cos(D[1]), 0, np.sin(D[1])], [0, 1, 0], [-np.sin(D[1]), 0, np.cos(D[1])]]
|
|
693
|
+
Mz = [[np.cos(D[2]), -np.sin(D[2]), 0], [np.sin(D[2]), np.cos(D[2]), 0], [0, 0, 1]]
|
|
694
|
+
# get full rotation matrix
|
|
695
|
+
M = np.array(np.mat(Mx) * np.mat(My) * np.mat(Mz))
|
|
696
|
+
p = [0.0, 0.0, 0.0]
|
|
697
|
+
# rotate atom and translate it back from origin
|
|
698
|
+
p[0] = M[0][0] * ps[0] + M[0][1] * ps[1] + M[0][2] * ps[2] + Rp[0]
|
|
699
|
+
p[1] = M[1][0] * ps[0] + M[1][1] * ps[1] + M[1][2] * ps[2] + Rp[1]
|
|
700
|
+
p[2] = M[2][0] * ps[0] + M[2][1] * ps[1] + M[2][2] * ps[2] + Rp[2]
|
|
701
|
+
return p
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
def reflect_through_plane(mol, u, Rp):
|
|
705
|
+
"""Reflects molecule about plane defined by its normal vector and a point on the plane.
|
|
706
|
+
Loops over ReflectPlane().
|
|
707
|
+
|
|
708
|
+
Parameters
|
|
709
|
+
----------
|
|
710
|
+
mol : mol3D
|
|
711
|
+
mol3D class instance of molecule to be reflected.
|
|
712
|
+
u : list
|
|
713
|
+
Normal vector to plane.
|
|
714
|
+
Rp : list
|
|
715
|
+
Reference point on plane.
|
|
716
|
+
|
|
717
|
+
Returns
|
|
718
|
+
-------
|
|
719
|
+
mol : mol3D
|
|
720
|
+
mol3D class instance of reflected molecule.
|
|
721
|
+
|
|
722
|
+
"""
|
|
723
|
+
un = norm(u)
|
|
724
|
+
if (un > 1e-16):
|
|
725
|
+
u[0] = u[0] / un
|
|
726
|
+
u[1] = u[1] / un
|
|
727
|
+
u[2] = u[2] / un
|
|
728
|
+
for atom in mol.atoms:
|
|
729
|
+
# Get new point after rotation
|
|
730
|
+
Rt = ReflectPlane(u, atom.coords(), Rp)
|
|
731
|
+
atom.setcoords(Rt)
|
|
732
|
+
return mol
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
def rotate_around_axis(mol, Rp, u, theta):
|
|
736
|
+
"""Rotates molecule about axis defined by direction vector and point on axis.
|
|
737
|
+
Loops over PointRotateAxis().
|
|
738
|
+
|
|
739
|
+
Parameters
|
|
740
|
+
----------
|
|
741
|
+
mol : mol3D
|
|
742
|
+
mol3D class instance of molecule to be rotated.
|
|
743
|
+
Rp : list
|
|
744
|
+
Reference point along axis.
|
|
745
|
+
u : list
|
|
746
|
+
Direction vector of axis.
|
|
747
|
+
theta : float
|
|
748
|
+
Angle of rotation in DEGREES.
|
|
749
|
+
|
|
750
|
+
Returns
|
|
751
|
+
-------
|
|
752
|
+
mol : mol3D
|
|
753
|
+
mol3D class instance of rotated molecule.
|
|
754
|
+
|
|
755
|
+
"""
|
|
756
|
+
un = norm(u)
|
|
757
|
+
theta = (theta / 180.0) * np.pi
|
|
758
|
+
if (un > 1e-16):
|
|
759
|
+
u[0] = u[0] / un
|
|
760
|
+
u[1] = u[1] / un
|
|
761
|
+
u[2] = u[2] / un
|
|
762
|
+
for atom in mol.atoms:
|
|
763
|
+
# Get new point after rotation
|
|
764
|
+
Rt = PointRotateAxis(u, Rp, atom.coords(), theta)
|
|
765
|
+
atom.setcoords(Rt)
|
|
766
|
+
return mol
|
|
767
|
+
|
|
768
|
+
|
|
769
|
+
def rotate_mat(mol, R):
|
|
770
|
+
"""Rotates molecule using arbitrary rotation matrix.
|
|
771
|
+
Loops over PointRotateMat().
|
|
772
|
+
|
|
773
|
+
Parameters
|
|
774
|
+
----------
|
|
775
|
+
mol : mol3D
|
|
776
|
+
mol3D class instance of molecule to be rotated.
|
|
777
|
+
R : list
|
|
778
|
+
List of lists containing rotation matrix.
|
|
779
|
+
|
|
780
|
+
Returns
|
|
781
|
+
-------
|
|
782
|
+
mol : mol3D
|
|
783
|
+
mol3D class instance of rotated molecule.
|
|
784
|
+
|
|
785
|
+
"""
|
|
786
|
+
for atom in mol.atoms:
|
|
787
|
+
# Get new point after rotation
|
|
788
|
+
Rt = PointRotateMat(atom.coords(), R)
|
|
789
|
+
atom.setcoords(Rt)
|
|
790
|
+
return mol
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
def setPdistance(mol, Rr, Rp, bond):
|
|
794
|
+
"""Translates molecule such that a given point in the molecule is at a given distance from a reference point.
|
|
795
|
+
The molecule is moved along the axis given by the two points.
|
|
796
|
+
|
|
797
|
+
Parameters
|
|
798
|
+
----------
|
|
799
|
+
mol : mol3D
|
|
800
|
+
mol3D class instance of molecule to be translated.
|
|
801
|
+
Rr : list
|
|
802
|
+
Point in molecule to be aligned.
|
|
803
|
+
Rp : list
|
|
804
|
+
Reference alignment point.
|
|
805
|
+
bond : float
|
|
806
|
+
Final distance of aligned point to alignment point
|
|
807
|
+
|
|
808
|
+
Returns
|
|
809
|
+
-------
|
|
810
|
+
mol : mol3D
|
|
811
|
+
mol3D class instance of translated molecule.
|
|
812
|
+
dxyz : np.array
|
|
813
|
+
The translation vector.
|
|
814
|
+
|
|
815
|
+
"""
|
|
816
|
+
# get float bond length
|
|
817
|
+
bl = float(bond)
|
|
818
|
+
# get center of mass
|
|
819
|
+
# get unit vector through line r = r0 + t*u
|
|
820
|
+
dxyz = [0, 0, 0]
|
|
821
|
+
try:
|
|
822
|
+
u = [a - b for a, b in zip(Rr, Rp)]
|
|
823
|
+
t = bl / norm(u) # get t as t=bl/norm(r1-r0)
|
|
824
|
+
# get shift for centermass
|
|
825
|
+
dxyz[0] = Rp[0] + t * u[0] - Rr[0]
|
|
826
|
+
dxyz[1] = Rp[1] + t * u[1] - Rr[1]
|
|
827
|
+
dxyz[2] = Rp[2] + t * u[2] - Rr[2]
|
|
828
|
+
except ZeroDivisionError:
|
|
829
|
+
pass
|
|
830
|
+
# translate molecule
|
|
831
|
+
mol.translate(dxyz)
|
|
832
|
+
return mol, dxyz
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
def setPdistanceu(mol, Rr, Rp, bond, u):
|
|
836
|
+
"""Translates molecule such that a given point in the molecule is at a given distance from a reference point.
|
|
837
|
+
The molecule is moved along an arbitrary axis.
|
|
838
|
+
|
|
839
|
+
Parameters
|
|
840
|
+
----------
|
|
841
|
+
mol : mol3D
|
|
842
|
+
mol3D class instance of molecule to be translated.
|
|
843
|
+
Rr : list
|
|
844
|
+
Point in molecule to be aligned.
|
|
845
|
+
Rp : list
|
|
846
|
+
Reference alignment point.
|
|
847
|
+
bond : float
|
|
848
|
+
Final distance of aligned point to alignment point
|
|
849
|
+
u : list
|
|
850
|
+
Direction vector of axis
|
|
851
|
+
|
|
852
|
+
Returns
|
|
853
|
+
-------
|
|
854
|
+
mol : mol3D
|
|
855
|
+
mol3D class instance of translated molecule.
|
|
856
|
+
|
|
857
|
+
"""
|
|
858
|
+
# get float bond length
|
|
859
|
+
bl = float(bond)
|
|
860
|
+
# get unit vector through line r = r0 + t*u
|
|
861
|
+
t = bl / norm(u) # get t as t=bl/norm(r1-r0)
|
|
862
|
+
# get shift for centermass
|
|
863
|
+
dxyz = [0, 0, 0]
|
|
864
|
+
dxyz[0] = Rp[0] + t * u[0] - Rr[0]
|
|
865
|
+
dxyz[1] = Rp[1] + t * u[1] - Rr[1]
|
|
866
|
+
dxyz[2] = Rp[2] + t * u[2] - Rr[2]
|
|
867
|
+
# translate molecule
|
|
868
|
+
mol.translate(dxyz)
|
|
869
|
+
return mol
|
|
870
|
+
|
|
871
|
+
|
|
872
|
+
def setcmdistance(mol, Rp, bond):
|
|
873
|
+
"""Translates molecule such that its center of mass is at a given distance from a reference point.
|
|
874
|
+
The molecule is moved along the axis given by the two points.
|
|
875
|
+
|
|
876
|
+
Parameters
|
|
877
|
+
----------
|
|
878
|
+
mol : mol3D
|
|
879
|
+
mol3D class instance of molecule to be translated.
|
|
880
|
+
Rp : list
|
|
881
|
+
Reference alignment point.
|
|
882
|
+
bond : float
|
|
883
|
+
Final distance of aligned point to alignment point
|
|
884
|
+
|
|
885
|
+
Returns
|
|
886
|
+
-------
|
|
887
|
+
mol : mol3D
|
|
888
|
+
mol3D class instance of translated molecule.
|
|
889
|
+
|
|
890
|
+
"""
|
|
891
|
+
# get float bond length
|
|
892
|
+
bl = float(bond)
|
|
893
|
+
# get center of mass
|
|
894
|
+
cm = mol.centermass()
|
|
895
|
+
# get unit vector through line r = r0 + t*u
|
|
896
|
+
u = [a - b for a, b in zip(cm, Rp)]
|
|
897
|
+
t = bl / norm(u) # get t as t=bl/norm(r1-r0)
|
|
898
|
+
# get shift for centermass
|
|
899
|
+
dxyz = [0, 0, 0]
|
|
900
|
+
dxyz[0] = Rp[0] + t * u[0] - cm[0]
|
|
901
|
+
dxyz[1] = Rp[1] + t * u[1] - cm[1]
|
|
902
|
+
dxyz[2] = Rp[2] + t * u[2] - cm[2]
|
|
903
|
+
# translate molecule
|
|
904
|
+
mol.translate(dxyz)
|
|
905
|
+
return mol
|
|
906
|
+
|
|
907
|
+
|
|
908
|
+
def protate(mol, Rr, D):
|
|
909
|
+
"""Translates molecule in spherical coordinates based on center of mass reference.
|
|
910
|
+
Loops over PointTranslateSph().
|
|
911
|
+
|
|
912
|
+
Parameters
|
|
913
|
+
----------
|
|
914
|
+
mol : mol3D
|
|
915
|
+
mol3D class instance of molecule to be translated.
|
|
916
|
+
Rr : list
|
|
917
|
+
Origin of sphere.
|
|
918
|
+
D : list
|
|
919
|
+
[final radial distance, change in polar phi, change in azimuthal theta] in RADIANS
|
|
920
|
+
|
|
921
|
+
Returns
|
|
922
|
+
-------
|
|
923
|
+
mol : mol3D
|
|
924
|
+
mol3D class instance of translated molecule.
|
|
925
|
+
|
|
926
|
+
"""
|
|
927
|
+
# convert to rad
|
|
928
|
+
D[0] = float(D[0])
|
|
929
|
+
D[1] = (float(D[1]) / 180.0) * np.pi
|
|
930
|
+
D[2] = (float(D[2]) / 180.0) * np.pi
|
|
931
|
+
# rotate/translate about reference point
|
|
932
|
+
# get center of mass
|
|
933
|
+
pmc = mol.centermass()
|
|
934
|
+
# get translation vector that corresponds to new coords
|
|
935
|
+
Rt = PointTranslateSph(Rr, pmc, D)
|
|
936
|
+
# translate molecule
|
|
937
|
+
mol.translate(Rt)
|
|
938
|
+
return mol
|
|
939
|
+
|
|
940
|
+
|
|
941
|
+
def protateref(mol, Rr, Rref, D):
|
|
942
|
+
"""Translates molecule in spherical coordinates based on arbitrary reference.
|
|
943
|
+
Loops over PointTranslateSph().
|
|
944
|
+
|
|
945
|
+
Parameters
|
|
946
|
+
----------
|
|
947
|
+
mol : mol3D
|
|
948
|
+
mol3D class instance of molecule to be translated.
|
|
949
|
+
Rr : list
|
|
950
|
+
Origin of sphere.
|
|
951
|
+
Rref : list
|
|
952
|
+
Reference point in molecule
|
|
953
|
+
D : list
|
|
954
|
+
[final radial distance, change in polar phi, change in azimuthal theta] in RADIANS
|
|
955
|
+
|
|
956
|
+
Returns
|
|
957
|
+
-------
|
|
958
|
+
mol : mol3D
|
|
959
|
+
mol3D class instance of translated molecule.
|
|
960
|
+
|
|
961
|
+
"""
|
|
962
|
+
# rotate/translate about reference point
|
|
963
|
+
# convert to rad
|
|
964
|
+
D[0] = float(D[0])
|
|
965
|
+
D[1] = (float(D[1]) / 180.0) * np.pi
|
|
966
|
+
D[2] = (float(D[2]) / 180.0) * np.pi
|
|
967
|
+
# rotate/translate about reference point
|
|
968
|
+
# get translation vector that corresponds to new coords
|
|
969
|
+
Rt = PointTranslateSph(Rr, Rref, D)
|
|
970
|
+
# translate molecule
|
|
971
|
+
mol.translate(Rt)
|
|
972
|
+
return mol
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
def cmrotate(mol, D):
|
|
976
|
+
"""Rotates molecule about its center of mass
|
|
977
|
+
Loops over PointRotateSph().
|
|
978
|
+
|
|
979
|
+
Parameters
|
|
980
|
+
----------
|
|
981
|
+
mol : mol3D
|
|
982
|
+
mol3D class instance of molecule to be rotated.
|
|
983
|
+
D : list
|
|
984
|
+
[theta-x, theta-y, theta-z] in RADIANS
|
|
985
|
+
|
|
986
|
+
Returns
|
|
987
|
+
-------
|
|
988
|
+
mol : mol3D
|
|
989
|
+
mol3D class instance of rotated molecule.
|
|
990
|
+
|
|
991
|
+
"""
|
|
992
|
+
# convert to rad
|
|
993
|
+
D[0] = (float(D[0]) / 180.0) * np.pi
|
|
994
|
+
D[1] = (float(D[1]) / 180.0) * np.pi
|
|
995
|
+
D[2] = (float(D[2]) / 180.0) * np.pi
|
|
996
|
+
# perform rotation
|
|
997
|
+
pmc = mol.centermass()
|
|
998
|
+
for atom in mol.atoms:
|
|
999
|
+
# Get new point after rotation
|
|
1000
|
+
Rt = PointRotateSph(pmc, atom.coords(), D)
|
|
1001
|
+
atom.setcoords(Rt)
|
|
1002
|
+
return mol
|
|
1003
|
+
|
|
1004
|
+
|
|
1005
|
+
def rotateRef(mol, Ref, D):
|
|
1006
|
+
"""Rotates molecule about an arbitrary point
|
|
1007
|
+
Loops over PointRotateSph().
|
|
1008
|
+
|
|
1009
|
+
Parameters
|
|
1010
|
+
----------
|
|
1011
|
+
mol : mol3D
|
|
1012
|
+
mol3D class instance of molecule to be rotated.
|
|
1013
|
+
Ref : list
|
|
1014
|
+
Reference point
|
|
1015
|
+
D : list
|
|
1016
|
+
[theta-x, theta-y, theta-z] in RADIANS
|
|
1017
|
+
|
|
1018
|
+
Returns
|
|
1019
|
+
-------
|
|
1020
|
+
mol : mol3D
|
|
1021
|
+
mol3D class instance of rotated molecule.
|
|
1022
|
+
|
|
1023
|
+
"""
|
|
1024
|
+
# convert to rad
|
|
1025
|
+
D[0] = (float(D[0]) / 180.0) * np.pi
|
|
1026
|
+
D[1] = (float(D[1]) / 180.0) * np.pi
|
|
1027
|
+
D[2] = (float(D[2]) / 180.0) * np.pi
|
|
1028
|
+
# perform rotation
|
|
1029
|
+
for atom in mol.atoms:
|
|
1030
|
+
# Get new point after rotation
|
|
1031
|
+
Rt = PointRotateSph(Ref, atom.coords(), D)
|
|
1032
|
+
atom.setcoords(Rt)
|
|
1033
|
+
return mol
|
|
1034
|
+
|
|
1035
|
+
|
|
1036
|
+
def aligntoaxis(mol, Rr, Rp, u):
|
|
1037
|
+
"""Translates molecule to align point to axis at constant distance.
|
|
1038
|
+
|
|
1039
|
+
Parameters
|
|
1040
|
+
----------
|
|
1041
|
+
mol : mol3D
|
|
1042
|
+
mol3D class instance of molecule to be translated.
|
|
1043
|
+
Rr : list
|
|
1044
|
+
Point to be aligned
|
|
1045
|
+
Rp : list
|
|
1046
|
+
Reference point on axis
|
|
1047
|
+
u : list
|
|
1048
|
+
Target axis for alignment
|
|
1049
|
+
|
|
1050
|
+
Returns
|
|
1051
|
+
-------
|
|
1052
|
+
mol : mol3D
|
|
1053
|
+
mol3D class instance of aligned molecule.
|
|
1054
|
+
|
|
1055
|
+
"""
|
|
1056
|
+
# get current distance
|
|
1057
|
+
d0 = distance(Rp, Rr)
|
|
1058
|
+
# normalize u
|
|
1059
|
+
t = d0 / norm(u) # get t as t=bl/norm(r1-r0)
|
|
1060
|
+
# get shift for point
|
|
1061
|
+
dxyz = [0, 0, 0]
|
|
1062
|
+
dxyz[0] = Rp[0] + t * u[0] - Rr[0]
|
|
1063
|
+
dxyz[1] = Rp[1] + t * u[1] - Rr[1]
|
|
1064
|
+
dxyz[2] = Rp[2] + t * u[2] - Rr[2]
|
|
1065
|
+
# translate molecule
|
|
1066
|
+
mol.translate(dxyz)
|
|
1067
|
+
return mol
|
|
1068
|
+
|
|
1069
|
+
|
|
1070
|
+
def aligntoaxis2(mol, Rr, Rp, u, d):
|
|
1071
|
+
"""Translates molecule to align point to axis at arbitrary distance
|
|
1072
|
+
|
|
1073
|
+
Parameters
|
|
1074
|
+
----------
|
|
1075
|
+
mol : mol3D
|
|
1076
|
+
mol3D class instance of molecule to be translated.
|
|
1077
|
+
Rr : list
|
|
1078
|
+
Point to be aligned
|
|
1079
|
+
Rp : list
|
|
1080
|
+
Reference point on axis
|
|
1081
|
+
u : list
|
|
1082
|
+
Target axis for alignment
|
|
1083
|
+
d : float
|
|
1084
|
+
Final distance from aligned point to axis
|
|
1085
|
+
|
|
1086
|
+
Returns
|
|
1087
|
+
-------
|
|
1088
|
+
mol : mol3D
|
|
1089
|
+
mol3D class instance of translated molecule.
|
|
1090
|
+
|
|
1091
|
+
"""
|
|
1092
|
+
# normalize u
|
|
1093
|
+
t = d / norm(u) # get t as t=bl/norm(r1-r0)
|
|
1094
|
+
# get shift for point
|
|
1095
|
+
dxyz = [0, 0, 0]
|
|
1096
|
+
dxyz[0] = Rp[0] + t * u[0] - Rr[0]
|
|
1097
|
+
dxyz[1] = Rp[1] + t * u[1] - Rr[1]
|
|
1098
|
+
dxyz[2] = Rp[2] + t * u[2] - Rr[2]
|
|
1099
|
+
# translate molecule
|
|
1100
|
+
mol.translate(dxyz)
|
|
1101
|
+
return mol
|
|
1102
|
+
|
|
1103
|
+
|
|
1104
|
+
def alignPtoaxis(Rr, Rp, u, d):
|
|
1105
|
+
"""Translates point and aligns to axis
|
|
1106
|
+
|
|
1107
|
+
Parameters
|
|
1108
|
+
----------
|
|
1109
|
+
Rr : list
|
|
1110
|
+
Point to be aligned
|
|
1111
|
+
Rp : list
|
|
1112
|
+
Reference point on axis
|
|
1113
|
+
u : list
|
|
1114
|
+
Target axis for alignment. Direction vector.
|
|
1115
|
+
d : float
|
|
1116
|
+
Final distance from aligned point to axis
|
|
1117
|
+
|
|
1118
|
+
Returns
|
|
1119
|
+
-------
|
|
1120
|
+
dxyz : list
|
|
1121
|
+
Translation vector
|
|
1122
|
+
|
|
1123
|
+
"""
|
|
1124
|
+
# normalize u
|
|
1125
|
+
t = d / norm(u) # get t as t=bl/norm(r1-r0)
|
|
1126
|
+
# get shift for point
|
|
1127
|
+
dxyz = [0, 0, 0]
|
|
1128
|
+
dxyz[0] = Rp[0] + t * u[0]
|
|
1129
|
+
dxyz[1] = Rp[1] + t * u[1]
|
|
1130
|
+
dxyz[2] = Rp[2] + t * u[2]
|
|
1131
|
+
return dxyz
|
|
1132
|
+
|
|
1133
|
+
|
|
1134
|
+
def pmrotate(mol, Rp, D):
|
|
1135
|
+
"""Rotates molecule about Cartesian axes defined relative to given origin.
|
|
1136
|
+
Loops over PointRotateSph().
|
|
1137
|
+
|
|
1138
|
+
Parameters
|
|
1139
|
+
----------
|
|
1140
|
+
mol : mol3D
|
|
1141
|
+
mol3D class instance of molecule to be rotated.
|
|
1142
|
+
Rp : list
|
|
1143
|
+
Cartesian origin.
|
|
1144
|
+
D : list
|
|
1145
|
+
[theta-x, theta-y, theta-z] in DEGREES
|
|
1146
|
+
|
|
1147
|
+
Returns
|
|
1148
|
+
-------
|
|
1149
|
+
mol : mol3D
|
|
1150
|
+
mol3D class instance of rotated molecule.
|
|
1151
|
+
|
|
1152
|
+
"""
|
|
1153
|
+
# convert to rad
|
|
1154
|
+
D[0] = (float(D[0]) / 180.0) * np.pi
|
|
1155
|
+
D[1] = (float(D[1]) / 180.0) * np.pi
|
|
1156
|
+
D[2] = (float(D[2]) / 180.0) * np.pi
|
|
1157
|
+
# perform rotation
|
|
1158
|
+
for atom in mol.atoms:
|
|
1159
|
+
# Get new point after rotation
|
|
1160
|
+
Rt = PointRotateSph(Rp, atom.coords(), D)
|
|
1161
|
+
atom.setcoords(Rt)
|
|
1162
|
+
return mol
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
def connectivity_match(inds1, inds2, mol1, mol2):
|
|
1166
|
+
"""Check whether the connectivity of two fragments of mols match.
|
|
1167
|
+
Note: This will mark atom transfers between different ligands as False, which may not be correct mathmetically
|
|
1168
|
+
as the graph after atoms transfer can still be the same. We disallow these cases from chemical concerns and avoid
|
|
1169
|
+
the NP-hard porblem of comparing two adjecent matrix.
|
|
1170
|
+
|
|
1171
|
+
Parameters
|
|
1172
|
+
----------
|
|
1173
|
+
inds1 : list
|
|
1174
|
+
List of atom inds in molecule 1.
|
|
1175
|
+
inds2 : list
|
|
1176
|
+
List of atom inds in molecule 2.
|
|
1177
|
+
mol1 : mol3D
|
|
1178
|
+
mol3D class instance for molecule 1.
|
|
1179
|
+
mol2 : mol3D
|
|
1180
|
+
mol3D class instance for molecule 2.
|
|
1181
|
+
|
|
1182
|
+
Returns
|
|
1183
|
+
-------
|
|
1184
|
+
match_flag : bool
|
|
1185
|
+
Flag for if connectivity matches. True if so.
|
|
1186
|
+
|
|
1187
|
+
"""
|
|
1188
|
+
match = False
|
|
1189
|
+
if len(inds1) == len(inds2):
|
|
1190
|
+
inds1.sort()
|
|
1191
|
+
inds2.sort()
|
|
1192
|
+
_mol1 = mol1.create_mol_with_inds(inds1)
|
|
1193
|
+
_mol2 = mol2.create_mol_with_inds(inds2)
|
|
1194
|
+
_mol1.createMolecularGraph()
|
|
1195
|
+
_mol2.createMolecularGraph()
|
|
1196
|
+
match = np.array_equal(_mol1.graph, _mol2.graph)
|
|
1197
|
+
return match
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
def best_fit_plane(coordinates):
|
|
1201
|
+
"""Finds the best fitting plane to a set of atoms at the specified coordinates.
|
|
1202
|
+
|
|
1203
|
+
Parameters
|
|
1204
|
+
----------
|
|
1205
|
+
corerefcoords : np.array
|
|
1206
|
+
Coordinates of atoms for which the best fitting plane is to be found. Shape is 3 x N.
|
|
1207
|
+
|
|
1208
|
+
Returns
|
|
1209
|
+
-------
|
|
1210
|
+
normal_vector_plane : np.array
|
|
1211
|
+
The vector perpendicular to the best fitting plane.
|
|
1212
|
+
|
|
1213
|
+
"""
|
|
1214
|
+
# Solution from stack exchange
|
|
1215
|
+
|
|
1216
|
+
# subtract out the centroid and take the SVD
|
|
1217
|
+
svd = np.linalg.svd(coordinates - np.mean(coordinates, axis=1, keepdims=True))
|
|
1218
|
+
|
|
1219
|
+
# Extract the left singular vectors
|
|
1220
|
+
left = svd[0]
|
|
1221
|
+
|
|
1222
|
+
# the corresponding left singular vector is the normal vector of the best-fitting plane
|
|
1223
|
+
normal_vector_plane = left[:, -1]
|
|
1224
|
+
return normal_vector_plane
|