mlmm-toolkit 0.2.2.dev0__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.
- hessian_ff/__init__.py +50 -0
- hessian_ff/analytical_hessian.py +609 -0
- hessian_ff/constants.py +46 -0
- hessian_ff/forcefield.py +339 -0
- hessian_ff/loaders.py +608 -0
- hessian_ff/native/Makefile +8 -0
- hessian_ff/native/__init__.py +28 -0
- hessian_ff/native/analytical_hessian.py +88 -0
- hessian_ff/native/analytical_hessian_ext.cpp +258 -0
- hessian_ff/native/bonded.py +82 -0
- hessian_ff/native/bonded_ext.cpp +640 -0
- hessian_ff/native/loader.py +349 -0
- hessian_ff/native/nonbonded.py +118 -0
- hessian_ff/native/nonbonded_ext.cpp +1150 -0
- hessian_ff/prmtop_parmed.py +23 -0
- hessian_ff/system.py +107 -0
- hessian_ff/terms/__init__.py +14 -0
- hessian_ff/terms/angle.py +73 -0
- hessian_ff/terms/bond.py +44 -0
- hessian_ff/terms/cmap.py +406 -0
- hessian_ff/terms/dihedral.py +141 -0
- hessian_ff/terms/nonbonded.py +209 -0
- hessian_ff/tests/__init__.py +0 -0
- hessian_ff/tests/conftest.py +75 -0
- hessian_ff/tests/data/small/complex.parm7 +1346 -0
- hessian_ff/tests/data/small/complex.pdb +125 -0
- hessian_ff/tests/data/small/complex.rst7 +63 -0
- hessian_ff/tests/test_coords_input.py +44 -0
- hessian_ff/tests/test_energy_force.py +49 -0
- hessian_ff/tests/test_hessian.py +137 -0
- hessian_ff/tests/test_smoke.py +18 -0
- hessian_ff/tests/test_validation.py +40 -0
- hessian_ff/workflows.py +889 -0
- mlmm/__init__.py +36 -0
- mlmm/__main__.py +7 -0
- mlmm/_version.py +34 -0
- mlmm/add_elem_info.py +374 -0
- mlmm/advanced_help.py +91 -0
- mlmm/align_freeze_atoms.py +601 -0
- mlmm/all.py +3535 -0
- mlmm/bond_changes.py +231 -0
- mlmm/bool_compat.py +223 -0
- mlmm/cli.py +574 -0
- mlmm/cli_utils.py +166 -0
- mlmm/default_group.py +337 -0
- mlmm/defaults.py +467 -0
- mlmm/define_layer.py +526 -0
- mlmm/dft.py +1041 -0
- mlmm/energy_diagram.py +253 -0
- mlmm/extract.py +2213 -0
- mlmm/fix_altloc.py +464 -0
- mlmm/freq.py +1406 -0
- mlmm/harmonic_constraints.py +140 -0
- mlmm/hessian_cache.py +44 -0
- mlmm/hessian_calc.py +174 -0
- mlmm/irc.py +638 -0
- mlmm/mlmm_calc.py +2262 -0
- mlmm/mm_parm.py +945 -0
- mlmm/oniom_export.py +1983 -0
- mlmm/oniom_import.py +457 -0
- mlmm/opt.py +1742 -0
- mlmm/path_opt.py +1353 -0
- mlmm/path_search.py +2299 -0
- mlmm/preflight.py +88 -0
- mlmm/py.typed +1 -0
- mlmm/pysis_runner.py +45 -0
- mlmm/scan.py +1047 -0
- mlmm/scan2d.py +1226 -0
- mlmm/scan3d.py +1265 -0
- mlmm/scan_common.py +184 -0
- mlmm/summary_log.py +736 -0
- mlmm/trj2fig.py +448 -0
- mlmm/tsopt.py +2871 -0
- mlmm/utils.py +2309 -0
- mlmm/xtb_embedcharge_correction.py +475 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/METADATA +1159 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/RECORD +372 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/WHEEL +5 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/entry_points.txt +2 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/licenses/LICENSE +674 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/top_level.txt +4 -0
- pysisyphus/Geometry.py +1667 -0
- pysisyphus/LICENSE +674 -0
- pysisyphus/TableFormatter.py +63 -0
- pysisyphus/TablePrinter.py +74 -0
- pysisyphus/__init__.py +12 -0
- pysisyphus/calculators/AFIR.py +452 -0
- pysisyphus/calculators/AnaPot.py +20 -0
- pysisyphus/calculators/AnaPot2.py +48 -0
- pysisyphus/calculators/AnaPot3.py +12 -0
- pysisyphus/calculators/AnaPot4.py +20 -0
- pysisyphus/calculators/AnaPotBase.py +337 -0
- pysisyphus/calculators/AnaPotCBM.py +25 -0
- pysisyphus/calculators/AtomAtomTransTorque.py +154 -0
- pysisyphus/calculators/CFOUR.py +250 -0
- pysisyphus/calculators/Calculator.py +844 -0
- pysisyphus/calculators/CerjanMiller.py +24 -0
- pysisyphus/calculators/Composite.py +123 -0
- pysisyphus/calculators/ConicalIntersection.py +171 -0
- pysisyphus/calculators/DFTBp.py +430 -0
- pysisyphus/calculators/DFTD3.py +66 -0
- pysisyphus/calculators/DFTD4.py +84 -0
- pysisyphus/calculators/Dalton.py +61 -0
- pysisyphus/calculators/Dimer.py +681 -0
- pysisyphus/calculators/Dummy.py +20 -0
- pysisyphus/calculators/EGO.py +76 -0
- pysisyphus/calculators/EnergyMin.py +224 -0
- pysisyphus/calculators/ExternalPotential.py +264 -0
- pysisyphus/calculators/FakeASE.py +35 -0
- pysisyphus/calculators/FourWellAnaPot.py +28 -0
- pysisyphus/calculators/FreeEndNEBPot.py +39 -0
- pysisyphus/calculators/Gaussian09.py +18 -0
- pysisyphus/calculators/Gaussian16.py +726 -0
- pysisyphus/calculators/HardSphere.py +159 -0
- pysisyphus/calculators/IDPPCalculator.py +49 -0
- pysisyphus/calculators/IPIClient.py +133 -0
- pysisyphus/calculators/IPIServer.py +234 -0
- pysisyphus/calculators/LEPSBase.py +24 -0
- pysisyphus/calculators/LEPSExpr.py +139 -0
- pysisyphus/calculators/LennardJones.py +80 -0
- pysisyphus/calculators/MOPAC.py +219 -0
- pysisyphus/calculators/MullerBrownSympyPot.py +51 -0
- pysisyphus/calculators/MultiCalc.py +85 -0
- pysisyphus/calculators/NFK.py +45 -0
- pysisyphus/calculators/OBabel.py +87 -0
- pysisyphus/calculators/ONIOMv2.py +1129 -0
- pysisyphus/calculators/ORCA.py +893 -0
- pysisyphus/calculators/ORCA5.py +6 -0
- pysisyphus/calculators/OpenMM.py +88 -0
- pysisyphus/calculators/OpenMolcas.py +281 -0
- pysisyphus/calculators/OverlapCalculator.py +908 -0
- pysisyphus/calculators/Psi4.py +218 -0
- pysisyphus/calculators/PyPsi4.py +37 -0
- pysisyphus/calculators/PySCF.py +341 -0
- pysisyphus/calculators/PyXTB.py +73 -0
- pysisyphus/calculators/QCEngine.py +106 -0
- pysisyphus/calculators/Rastrigin.py +22 -0
- pysisyphus/calculators/Remote.py +76 -0
- pysisyphus/calculators/Rosenbrock.py +15 -0
- pysisyphus/calculators/SocketCalc.py +97 -0
- pysisyphus/calculators/TIP3P.py +111 -0
- pysisyphus/calculators/TransTorque.py +161 -0
- pysisyphus/calculators/Turbomole.py +965 -0
- pysisyphus/calculators/VRIPot.py +37 -0
- pysisyphus/calculators/WFOWrapper.py +333 -0
- pysisyphus/calculators/WFOWrapper2.py +341 -0
- pysisyphus/calculators/XTB.py +418 -0
- pysisyphus/calculators/__init__.py +81 -0
- pysisyphus/calculators/cosmo_data.py +139 -0
- pysisyphus/calculators/parser.py +150 -0
- pysisyphus/color.py +19 -0
- pysisyphus/config.py +133 -0
- pysisyphus/constants.py +65 -0
- pysisyphus/cos/AdaptiveNEB.py +230 -0
- pysisyphus/cos/ChainOfStates.py +725 -0
- pysisyphus/cos/FreeEndNEB.py +25 -0
- pysisyphus/cos/FreezingString.py +103 -0
- pysisyphus/cos/GrowingChainOfStates.py +71 -0
- pysisyphus/cos/GrowingNT.py +309 -0
- pysisyphus/cos/GrowingString.py +508 -0
- pysisyphus/cos/NEB.py +189 -0
- pysisyphus/cos/SimpleZTS.py +64 -0
- pysisyphus/cos/__init__.py +22 -0
- pysisyphus/cos/stiffness.py +199 -0
- pysisyphus/drivers/__init__.py +17 -0
- pysisyphus/drivers/afir.py +855 -0
- pysisyphus/drivers/barriers.py +271 -0
- pysisyphus/drivers/birkholz.py +138 -0
- pysisyphus/drivers/cluster.py +318 -0
- pysisyphus/drivers/diabatization.py +133 -0
- pysisyphus/drivers/merge.py +368 -0
- pysisyphus/drivers/merge_mol2.py +322 -0
- pysisyphus/drivers/opt.py +375 -0
- pysisyphus/drivers/perf.py +91 -0
- pysisyphus/drivers/pka.py +52 -0
- pysisyphus/drivers/precon_pos_rot.py +669 -0
- pysisyphus/drivers/rates.py +480 -0
- pysisyphus/drivers/replace.py +219 -0
- pysisyphus/drivers/scan.py +212 -0
- pysisyphus/drivers/spectrum.py +166 -0
- pysisyphus/drivers/thermo.py +31 -0
- pysisyphus/dynamics/Gaussian.py +103 -0
- pysisyphus/dynamics/__init__.py +20 -0
- pysisyphus/dynamics/colvars.py +136 -0
- pysisyphus/dynamics/driver.py +297 -0
- pysisyphus/dynamics/helpers.py +256 -0
- pysisyphus/dynamics/lincs.py +105 -0
- pysisyphus/dynamics/mdp.py +364 -0
- pysisyphus/dynamics/rattle.py +121 -0
- pysisyphus/dynamics/thermostats.py +128 -0
- pysisyphus/dynamics/wigner.py +266 -0
- pysisyphus/elem_data.py +3473 -0
- pysisyphus/exceptions.py +2 -0
- pysisyphus/filtertrj.py +69 -0
- pysisyphus/helpers.py +623 -0
- pysisyphus/helpers_pure.py +649 -0
- pysisyphus/init_logging.py +50 -0
- pysisyphus/intcoords/Bend.py +69 -0
- pysisyphus/intcoords/Bend2.py +25 -0
- pysisyphus/intcoords/BondedFragment.py +32 -0
- pysisyphus/intcoords/Cartesian.py +41 -0
- pysisyphus/intcoords/CartesianCoords.py +140 -0
- pysisyphus/intcoords/Coords.py +56 -0
- pysisyphus/intcoords/DLC.py +197 -0
- pysisyphus/intcoords/DistanceFunction.py +34 -0
- pysisyphus/intcoords/DummyImproper.py +70 -0
- pysisyphus/intcoords/DummyTorsion.py +72 -0
- pysisyphus/intcoords/LinearBend.py +105 -0
- pysisyphus/intcoords/LinearDisplacement.py +80 -0
- pysisyphus/intcoords/OutOfPlane.py +59 -0
- pysisyphus/intcoords/PrimTypes.py +286 -0
- pysisyphus/intcoords/Primitive.py +137 -0
- pysisyphus/intcoords/RedundantCoords.py +659 -0
- pysisyphus/intcoords/RobustTorsion.py +59 -0
- pysisyphus/intcoords/Rotation.py +147 -0
- pysisyphus/intcoords/Stretch.py +31 -0
- pysisyphus/intcoords/Torsion.py +101 -0
- pysisyphus/intcoords/Torsion2.py +25 -0
- pysisyphus/intcoords/Translation.py +45 -0
- pysisyphus/intcoords/__init__.py +61 -0
- pysisyphus/intcoords/augment_bonds.py +126 -0
- pysisyphus/intcoords/derivatives.py +10512 -0
- pysisyphus/intcoords/eval.py +80 -0
- pysisyphus/intcoords/exceptions.py +37 -0
- pysisyphus/intcoords/findiffs.py +48 -0
- pysisyphus/intcoords/generate_derivatives.py +414 -0
- pysisyphus/intcoords/helpers.py +235 -0
- pysisyphus/intcoords/logging_conf.py +10 -0
- pysisyphus/intcoords/mp_derivatives.py +10836 -0
- pysisyphus/intcoords/setup.py +962 -0
- pysisyphus/intcoords/setup_fast.py +176 -0
- pysisyphus/intcoords/update.py +272 -0
- pysisyphus/intcoords/valid.py +89 -0
- pysisyphus/interpolate/Geodesic.py +93 -0
- pysisyphus/interpolate/IDPP.py +55 -0
- pysisyphus/interpolate/Interpolator.py +116 -0
- pysisyphus/interpolate/LST.py +70 -0
- pysisyphus/interpolate/Redund.py +152 -0
- pysisyphus/interpolate/__init__.py +9 -0
- pysisyphus/interpolate/helpers.py +34 -0
- pysisyphus/io/__init__.py +22 -0
- pysisyphus/io/aomix.py +178 -0
- pysisyphus/io/cjson.py +24 -0
- pysisyphus/io/crd.py +101 -0
- pysisyphus/io/cube.py +220 -0
- pysisyphus/io/fchk.py +184 -0
- pysisyphus/io/hdf5.py +49 -0
- pysisyphus/io/hessian.py +72 -0
- pysisyphus/io/mol2.py +146 -0
- pysisyphus/io/molden.py +293 -0
- pysisyphus/io/orca.py +189 -0
- pysisyphus/io/pdb.py +269 -0
- pysisyphus/io/psf.py +79 -0
- pysisyphus/io/pubchem.py +31 -0
- pysisyphus/io/qcschema.py +34 -0
- pysisyphus/io/sdf.py +29 -0
- pysisyphus/io/xyz.py +61 -0
- pysisyphus/io/zmat.py +175 -0
- pysisyphus/irc/DWI.py +108 -0
- pysisyphus/irc/DampedVelocityVerlet.py +134 -0
- pysisyphus/irc/Euler.py +22 -0
- pysisyphus/irc/EulerPC.py +345 -0
- pysisyphus/irc/GonzalezSchlegel.py +187 -0
- pysisyphus/irc/IMKMod.py +164 -0
- pysisyphus/irc/IRC.py +878 -0
- pysisyphus/irc/IRCDummy.py +10 -0
- pysisyphus/irc/Instanton.py +307 -0
- pysisyphus/irc/LQA.py +53 -0
- pysisyphus/irc/ModeKill.py +136 -0
- pysisyphus/irc/ParamPlot.py +53 -0
- pysisyphus/irc/RK4.py +36 -0
- pysisyphus/irc/__init__.py +31 -0
- pysisyphus/irc/initial_displ.py +219 -0
- pysisyphus/linalg.py +411 -0
- pysisyphus/line_searches/Backtracking.py +88 -0
- pysisyphus/line_searches/HagerZhang.py +184 -0
- pysisyphus/line_searches/LineSearch.py +232 -0
- pysisyphus/line_searches/StrongWolfe.py +108 -0
- pysisyphus/line_searches/__init__.py +9 -0
- pysisyphus/line_searches/interpol.py +15 -0
- pysisyphus/modefollow/NormalMode.py +40 -0
- pysisyphus/modefollow/__init__.py +10 -0
- pysisyphus/modefollow/davidson.py +199 -0
- pysisyphus/modefollow/lanczos.py +95 -0
- pysisyphus/optimizers/BFGS.py +99 -0
- pysisyphus/optimizers/BacktrackingOptimizer.py +113 -0
- pysisyphus/optimizers/ConjugateGradient.py +98 -0
- pysisyphus/optimizers/CubicNewton.py +75 -0
- pysisyphus/optimizers/FIRE.py +113 -0
- pysisyphus/optimizers/HessianOptimizer.py +1176 -0
- pysisyphus/optimizers/LBFGS.py +228 -0
- pysisyphus/optimizers/LayerOpt.py +411 -0
- pysisyphus/optimizers/MicroOptimizer.py +169 -0
- pysisyphus/optimizers/NCOptimizer.py +90 -0
- pysisyphus/optimizers/Optimizer.py +1084 -0
- pysisyphus/optimizers/PreconLBFGS.py +260 -0
- pysisyphus/optimizers/PreconSteepestDescent.py +7 -0
- pysisyphus/optimizers/QuickMin.py +74 -0
- pysisyphus/optimizers/RFOptimizer.py +181 -0
- pysisyphus/optimizers/RSA.py +99 -0
- pysisyphus/optimizers/StabilizedQNMethod.py +248 -0
- pysisyphus/optimizers/SteepestDescent.py +23 -0
- pysisyphus/optimizers/StringOptimizer.py +173 -0
- pysisyphus/optimizers/__init__.py +41 -0
- pysisyphus/optimizers/closures.py +301 -0
- pysisyphus/optimizers/cls_map.py +58 -0
- pysisyphus/optimizers/exceptions.py +6 -0
- pysisyphus/optimizers/gdiis.py +280 -0
- pysisyphus/optimizers/guess_hessians.py +311 -0
- pysisyphus/optimizers/hessian_updates.py +355 -0
- pysisyphus/optimizers/poly_fit.py +285 -0
- pysisyphus/optimizers/precon.py +153 -0
- pysisyphus/optimizers/restrict_step.py +24 -0
- pysisyphus/pack.py +172 -0
- pysisyphus/peakdetect.py +948 -0
- pysisyphus/plot.py +1031 -0
- pysisyphus/run.py +2106 -0
- pysisyphus/socket_helper.py +74 -0
- pysisyphus/stocastic/FragmentKick.py +132 -0
- pysisyphus/stocastic/Kick.py +81 -0
- pysisyphus/stocastic/Pipeline.py +303 -0
- pysisyphus/stocastic/__init__.py +21 -0
- pysisyphus/stocastic/align.py +127 -0
- pysisyphus/testing.py +96 -0
- pysisyphus/thermo.py +156 -0
- pysisyphus/trj.py +824 -0
- pysisyphus/tsoptimizers/RSIRFOptimizer.py +56 -0
- pysisyphus/tsoptimizers/RSPRFOptimizer.py +182 -0
- pysisyphus/tsoptimizers/TRIM.py +59 -0
- pysisyphus/tsoptimizers/TSHessianOptimizer.py +463 -0
- pysisyphus/tsoptimizers/__init__.py +23 -0
- pysisyphus/wavefunction/Basis.py +239 -0
- pysisyphus/wavefunction/DIIS.py +76 -0
- pysisyphus/wavefunction/__init__.py +25 -0
- pysisyphus/wavefunction/build_ext.py +42 -0
- pysisyphus/wavefunction/cart2sph.py +190 -0
- pysisyphus/wavefunction/diabatization.py +304 -0
- pysisyphus/wavefunction/excited_states.py +435 -0
- pysisyphus/wavefunction/gen_ints.py +1811 -0
- pysisyphus/wavefunction/helpers.py +104 -0
- pysisyphus/wavefunction/ints/__init__.py +0 -0
- pysisyphus/wavefunction/ints/boys.py +193 -0
- pysisyphus/wavefunction/ints/boys_table_N_64_xasym_27.1_step_0.01.npy +0 -0
- pysisyphus/wavefunction/ints/cart_gto3d.py +176 -0
- pysisyphus/wavefunction/ints/coulomb3d.py +25928 -0
- pysisyphus/wavefunction/ints/diag_quadrupole3d.py +10036 -0
- pysisyphus/wavefunction/ints/dipole3d.py +8762 -0
- pysisyphus/wavefunction/ints/int2c2e3d.py +7198 -0
- pysisyphus/wavefunction/ints/int3c2e3d_sph.py +65040 -0
- pysisyphus/wavefunction/ints/kinetic3d.py +8240 -0
- pysisyphus/wavefunction/ints/ovlp3d.py +3777 -0
- pysisyphus/wavefunction/ints/quadrupole3d.py +15054 -0
- pysisyphus/wavefunction/ints/self_ovlp3d.py +198 -0
- pysisyphus/wavefunction/localization.py +458 -0
- pysisyphus/wavefunction/multipole.py +159 -0
- pysisyphus/wavefunction/normalization.py +36 -0
- pysisyphus/wavefunction/pop_analysis.py +134 -0
- pysisyphus/wavefunction/shells.py +1171 -0
- pysisyphus/wavefunction/wavefunction.py +504 -0
- pysisyphus/wrapper/__init__.py +11 -0
- pysisyphus/wrapper/exceptions.py +2 -0
- pysisyphus/wrapper/jmol.py +120 -0
- pysisyphus/wrapper/mwfn.py +169 -0
- pysisyphus/wrapper/packmol.py +71 -0
- pysisyphus/xyzloader.py +168 -0
- pysisyphus/yaml_mods.py +45 -0
- thermoanalysis/LICENSE +674 -0
- thermoanalysis/QCData.py +244 -0
- thermoanalysis/__init__.py +0 -0
- thermoanalysis/config.py +3 -0
- thermoanalysis/constants.py +20 -0
- thermoanalysis/thermo.py +1011 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from numpy.typing import NDArray
|
|
5
|
+
|
|
6
|
+
from pysisyphus.elem_data import COVALENT_RADII as CR
|
|
7
|
+
from pysisyphus.intcoords.exceptions import DifferentPrimitivesException
|
|
8
|
+
from pysisyphus.intcoords.RedundantCoords import RedundantCoords
|
|
9
|
+
from pysisyphus.intcoords.setup import get_bond_sets, BOND_FACTOR
|
|
10
|
+
from pysisyphus.intcoords.Stretch import Stretch
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def get_tangent(prims1, prims2, dihedral_inds, normalize=False):
|
|
14
|
+
"""Normalized tangent between primitive internal coordinates.
|
|
15
|
+
|
|
16
|
+
Tangent pointing from prims1 to prims2 in primitive
|
|
17
|
+
internal coordinates, taking into account the periodicity of
|
|
18
|
+
dihedral angles.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
prims1 : np.array
|
|
23
|
+
1d-array of primitive internal coordinates in the order
|
|
24
|
+
(stretches, bends, dihedrals).
|
|
25
|
+
prims2 : np.array
|
|
26
|
+
See prims1.
|
|
27
|
+
dihedral_inds : list of int
|
|
28
|
+
Dihedral indices in prims1 and prims2.
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
tangent : np.array
|
|
33
|
+
1d array containing the normalized tangent pointing from prims1 to prims2.
|
|
34
|
+
"""
|
|
35
|
+
try:
|
|
36
|
+
tangent = prims2 - prims1
|
|
37
|
+
except ValueError:
|
|
38
|
+
raise DifferentPrimitivesException
|
|
39
|
+
diheds = tangent[dihedral_inds].copy()
|
|
40
|
+
diheds_plus = diheds.copy() + 2 * np.pi
|
|
41
|
+
diheds_minus = diheds.copy() - 2 * np.pi
|
|
42
|
+
bigger = np.abs(diheds) > np.abs(diheds_plus)
|
|
43
|
+
diheds[bigger] = diheds_plus[bigger]
|
|
44
|
+
bigger = np.abs(diheds) > np.abs(diheds_minus)
|
|
45
|
+
diheds[bigger] = diheds_minus[bigger]
|
|
46
|
+
tangent[dihedral_inds] = diheds
|
|
47
|
+
if normalize:
|
|
48
|
+
tangent /= np.linalg.norm(tangent)
|
|
49
|
+
return tangent
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def get_step(geom, coords):
|
|
53
|
+
assert len(geom.coords) == len(coords)
|
|
54
|
+
|
|
55
|
+
if geom.coord_type == "cart":
|
|
56
|
+
diff = geom.coords - coords
|
|
57
|
+
elif geom.coord_type in ("redund", "dlc"):
|
|
58
|
+
diff = -get_tangent(
|
|
59
|
+
geom.internal.prim_coords, coords, geom.internal.dihedral_inds
|
|
60
|
+
)
|
|
61
|
+
else:
|
|
62
|
+
raise Exception("Invalid coord_type!")
|
|
63
|
+
|
|
64
|
+
# Convert to DLC
|
|
65
|
+
if geom.coord_type == "dlc":
|
|
66
|
+
diff = geom.internal.U.T.dot(diff)
|
|
67
|
+
|
|
68
|
+
return diff
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def merge_coordinate_definitions(geom1, geom2):
|
|
72
|
+
typed_prims1 = geom1.internal.typed_prims
|
|
73
|
+
typed_prims2 = geom2.internal.typed_prims
|
|
74
|
+
union = list(set(typed_prims1) | set(typed_prims2))
|
|
75
|
+
union.sort()
|
|
76
|
+
# Check if internal coordinates that are only present in one of the two
|
|
77
|
+
# geometries are valid in the other. If not, we omit these primitives.
|
|
78
|
+
redundant = RedundantCoords(geom1.atoms, geom1.cart_coords, typed_prims=union)
|
|
79
|
+
valid_typed_prims = redundant.typed_prims
|
|
80
|
+
return valid_typed_prims
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def form_coordinate_union(geom1, geom2):
|
|
84
|
+
def not_cartesian(geom):
|
|
85
|
+
return geom.coord_type != "cart"
|
|
86
|
+
|
|
87
|
+
assert not_cartesian(geom1) and not_cartesian(geom2)
|
|
88
|
+
# The first call yields all primitives from geom1 that are also valid at geom2.
|
|
89
|
+
typed_prims1 = merge_coordinate_definitions(geom1, geom2)
|
|
90
|
+
# The second call yields all primitives from geom2 that are also valid at geom1.
|
|
91
|
+
typed_prims2 = merge_coordinate_definitions(geom2, geom1)
|
|
92
|
+
|
|
93
|
+
intersection = list(set(typed_prims1) & set(typed_prims2))
|
|
94
|
+
intersection.sort()
|
|
95
|
+
return intersection
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def get_weighted_bond_mode(weighted_bonds, coords3d, remove_translation=True):
|
|
99
|
+
bond_mode = np.zeros_like(coords3d.flatten())
|
|
100
|
+
for *indices, weight in weighted_bonds:
|
|
101
|
+
_, grad = Stretch._calculate(coords3d, indices, gradient=True)
|
|
102
|
+
"""
|
|
103
|
+
The gradient gives us the direction into which the bond increases, but
|
|
104
|
+
we want that positive weights correspond to bond formation (distance
|
|
105
|
+
decrease) and negative weights to bond breaking (distance increase),
|
|
106
|
+
so we reverse the sign of the weight.
|
|
107
|
+
"""
|
|
108
|
+
bond_mode += -weight * grad
|
|
109
|
+
|
|
110
|
+
if remove_translation:
|
|
111
|
+
bm3d = bond_mode.reshape(-1, 3)
|
|
112
|
+
bond_mode = (bm3d - bm3d.mean(axis=0)[None, :]).flatten()
|
|
113
|
+
|
|
114
|
+
bond_mode /= np.linalg.norm(bond_mode)
|
|
115
|
+
return bond_mode
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def get_weighted_bond_mode_getter(
|
|
119
|
+
target_weighted_bonds, bond_factor=1.2, fractional=False
|
|
120
|
+
):
|
|
121
|
+
"""Create input for intcoords.helpers.get_weighted_bond_mode.
|
|
122
|
+
|
|
123
|
+
Compared to the rest of pysisyphus this method uses a slightly lowered
|
|
124
|
+
bond factor, so it is more strict regarding what is considered a bond
|
|
125
|
+
and what not."""
|
|
126
|
+
|
|
127
|
+
def func(atoms, coords3d):
|
|
128
|
+
bond_sets = [
|
|
129
|
+
set(bond)
|
|
130
|
+
for bond in get_bond_sets(atoms, coords3d, bond_factor=bond_factor).tolist()
|
|
131
|
+
]
|
|
132
|
+
bonds = list()
|
|
133
|
+
frac_weights = list()
|
|
134
|
+
for tbond in target_weighted_bonds:
|
|
135
|
+
*inds, weight = tbond
|
|
136
|
+
assert weight != 0.0
|
|
137
|
+
tset = set(inds)
|
|
138
|
+
"""
|
|
139
|
+
Skip target bond if weight is positive (bond is to be formed) and
|
|
140
|
+
bond is already present. Similarly, skip when the bond is to be broken
|
|
141
|
+
and it is not present.
|
|
142
|
+
"""
|
|
143
|
+
if (weight > 0 and tset in bond_sets) or (
|
|
144
|
+
weight < 0 and tset not in bond_sets
|
|
145
|
+
):
|
|
146
|
+
continue
|
|
147
|
+
bonds.append(tbond)
|
|
148
|
+
|
|
149
|
+
if fractional:
|
|
150
|
+
from_, to_ = inds
|
|
151
|
+
ref_len = CR[atoms[from_].lower()] + CR[atoms[to_].lower()]
|
|
152
|
+
act_len = np.linalg.norm(coords3d[from_] - coords3d[to_])
|
|
153
|
+
fw = (act_len / ref_len) ** weight
|
|
154
|
+
frac_weights.append(fw)
|
|
155
|
+
|
|
156
|
+
if fractional:
|
|
157
|
+
frac_weights = np.array(frac_weights)
|
|
158
|
+
frac_weights /= frac_weights.sum()
|
|
159
|
+
frac_weights = frac_weights ** 2
|
|
160
|
+
frac_weights /= frac_weights.max()
|
|
161
|
+
bonds = [(*inds, fw) for ((*inds, _), fw) in zip(bonds, frac_weights)]
|
|
162
|
+
return bonds
|
|
163
|
+
|
|
164
|
+
return func
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def get_bond_difference(geom1, geom2, bond_factor=BOND_FACTOR):
|
|
168
|
+
"""Return formed and broken bonds when going from geom1 to geom2."""
|
|
169
|
+
|
|
170
|
+
assert geom1.atoms == geom2.atoms
|
|
171
|
+
|
|
172
|
+
def as_sets(geom):
|
|
173
|
+
bonds = get_bond_sets(geom.atoms, geom.coords3d, bond_factor=bond_factor)
|
|
174
|
+
return set([frozenset(b) for b in bonds.tolist()])
|
|
175
|
+
|
|
176
|
+
def as_lists(bonds):
|
|
177
|
+
return [list(b) for b in bonds]
|
|
178
|
+
|
|
179
|
+
bonds1 = as_sets(geom1)
|
|
180
|
+
bonds2 = as_sets(geom2)
|
|
181
|
+
formed = as_lists(bonds2 - bonds1)
|
|
182
|
+
broken = as_lists(bonds1 - bonds2)
|
|
183
|
+
return formed, broken
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def verbose_bond_difference(formed, broken, key1, key2, atoms=None):
|
|
187
|
+
def atom_bonds(bonds):
|
|
188
|
+
if len(bonds) == 0:
|
|
189
|
+
ab = ""
|
|
190
|
+
elif atoms is not None:
|
|
191
|
+
ab = [f"{atoms[from_]}{from_}-{atoms[to_]}{to_}" for from_, to_ in bonds]
|
|
192
|
+
else:
|
|
193
|
+
ab = bonds
|
|
194
|
+
return ab
|
|
195
|
+
|
|
196
|
+
def pos(bonds):
|
|
197
|
+
"""Plural or singular?"""
|
|
198
|
+
return ("", "is") if (len(bonds) == 1) else ("s", "are")
|
|
199
|
+
|
|
200
|
+
sf, verbf = pos(formed)
|
|
201
|
+
sb, verbb = pos(broken)
|
|
202
|
+
|
|
203
|
+
# return (
|
|
204
|
+
# f"{key1}->{key2}: "
|
|
205
|
+
# f"{len(formed)} bond{sf} formed {atom_bonds(formed)}, "
|
|
206
|
+
# f"{len(broken)} bond{sb} broken {atom_bonds(broken)}."
|
|
207
|
+
# )
|
|
208
|
+
return (
|
|
209
|
+
f"{len(formed)} bond{sf} formed {atom_bonds(formed)}",
|
|
210
|
+
f"{len(broken)} bond{sb} broken {atom_bonds(broken)}",
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def get_bond_differences_verbose(
|
|
215
|
+
geom1, geom2, bond_factor=BOND_FACTOR, key1="geom1", key2="geom2"
|
|
216
|
+
):
|
|
217
|
+
formed, broken = get_bond_difference(geom1, geom2, BOND_FACTOR)
|
|
218
|
+
fverb, bverb = verbose_bond_difference(
|
|
219
|
+
formed, broken, key1, key2, atoms=geom1.atoms
|
|
220
|
+
)
|
|
221
|
+
return formed, broken, fverb, bverb
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def interfragment_distance(
|
|
225
|
+
frag1: List[int], frag2: List[int], coords3d: NDArray
|
|
226
|
+
) -> float:
|
|
227
|
+
def mean_coords(frag):
|
|
228
|
+
frag_coords = coords3d[frag]
|
|
229
|
+
mean = frag_coords.mean(axis=0)
|
|
230
|
+
return mean
|
|
231
|
+
|
|
232
|
+
frag1_mean = mean_coords(frag1)
|
|
233
|
+
frag2_mean = mean_coords(frag2)
|
|
234
|
+
interfrag_dist = float(np.linalg.norm(frag1_mean - frag2_mean))
|
|
235
|
+
return interfrag_dist
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from pysisyphus import logger as pysis_logger
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
logger = pysis_logger.getChild("internal_coords")
|
|
7
|
+
logger.setLevel(logging.DEBUG)
|
|
8
|
+
handler = logging.FileHandler("internal_coords.log", mode="w", delay=True)
|
|
9
|
+
handler.setLevel(logging.DEBUG)
|
|
10
|
+
logger.addHandler(handler)
|