From bd456ff63b0adb0fdf7010f882c392de7d84012d Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Wed, 7 Oct 2026 14:28:21 +0100 Subject: [PATCH 01/12] fix(axes): update all instances of `np.linalg.eig` to `np.linalg.eigh` --- CodeEntropy/levels/axes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CodeEntropy/levels/axes.py b/CodeEntropy/levels/axes.py index e2cbfa5a..53812dd6 100644 --- a/CodeEntropy/levels/axes.py +++ b/CodeEntropy/levels/axes.py @@ -836,7 +836,7 @@ def get_vanilla_axes(self, molecule): make_whole(molecule.atoms) principal_axes = molecule.principal_axes() - eigenvalues, _ = np.linalg.eig(moment_of_inertia_tensor) + eigenvalues, _ = np.linalg.eigh(moment_of_inertia_tensor) order = np.argsort(np.abs(eigenvalues))[::-1] moment_of_inertia = eigenvalues[order] @@ -1099,7 +1099,7 @@ def get_custom_principal_axes( - principal_axes: (3, 3) principal axes (rows). - moment_of_inertia: (3,) principal moments. """ - eigenvalues, eigenvectors = np.linalg.eig(moment_of_inertia_tensor) + eigenvalues, eigenvectors = np.linalg.eigh(moment_of_inertia_tensor) order = np.abs(eigenvalues).argsort()[::-1] # descending order transposed = np.transpose(eigenvectors) # columns -> rows moment_of_inertia = eigenvalues[order] From 87614bbf743ef6afb0d8b8dbda7524c826e5d70a Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Wed, 7 Oct 2026 14:45:06 +0100 Subject: [PATCH 02/12] fix(axes): use eigh-based principal axes instead of MDAnalysis principal_axes --- CodeEntropy/levels/axes.py | 44 +++++++++++++++++++++----- CodeEntropy/levels/nodes/covariance.py | 6 ++-- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/CodeEntropy/levels/axes.py b/CodeEntropy/levels/axes.py index 53812dd6..9ea542f4 100644 --- a/CodeEntropy/levels/axes.py +++ b/CodeEntropy/levels/axes.py @@ -149,7 +149,7 @@ def get_residue_axes( rot_center = np.array(residue.center_of_mass()) else: make_whole(data_container.atoms) - trans_axes = data_container.atoms.principal_axes() + trans_axes = self.get_principal_axes(data_container.atoms) if len(edge_atom_set) == 1: edge_atom = edge_atom_set[0] rot_center, rot_axes = self.get_terminal_axes( @@ -223,7 +223,7 @@ def get_residue_axes_from_topology( trans_axes = rot_axes else: make_whole(mol.atoms) - trans_axes = mol.atoms.principal_axes() + trans_axes = self.get_principal_axes(mol.atoms) rot_axes, moment_of_inertia = self.get_vanilla_axes(residue_atoms) center = residue_atoms.center_of_mass(unwrap=True) @@ -281,7 +281,7 @@ def get_UA_axes(self, data_container, index: int, res_position): # only the one residue => use principal axes residue = data_container trans_center = data_container.atoms.center_of_mass(unwrap=True) - trans_axes = data_container.atoms.principal_axes() + trans_axes = self.get_principal_axes(data_container.atoms) else: # residue of interest has at least one neighbour if res_position == -1 or res_position == 1: @@ -421,7 +421,7 @@ def get_UA_axes_from_topology( ) else: make_whole(residue_atoms) - trans_axes = residue_atoms.principal_axes() + trans_axes = self.get_principal_axes(residue_atoms) center = heavy_atom.position rot_axes, moment_of_inertia = self.get_bonded_axes_from_topology( @@ -611,7 +611,7 @@ def get_terminal_axes(self, residue, edge, dimensions): if len(bonded_atoms) == 0: # there is only one heavy atom in the residue rot_center = edge.position - rot_axes = residue.atoms.principal_axes() + rot_axes = self.get_principal_axes(residue.atoms) else: average_bonded = np.zeros(3) for bonded_atom in bonded_atoms: @@ -815,8 +815,8 @@ def find_bonded_atoms(self, atom_idx: int, system): def get_vanilla_axes(self, molecule): """Get principal axes and sorted principal moments (vanilla method). - Compute the principal axes and moments of inertia for a molecule using - MDAnalysis built-in functionality. + Compute the principal axes and moments of inertia for a molecule from its + moment of inertia tensor. The original description is preserved: - The molecule is made whole to ensure correct handling of PBC. @@ -834,7 +834,7 @@ def get_vanilla_axes(self, molecule): """ moment_of_inertia_tensor = molecule.moment_of_inertia(unwrap=True) make_whole(molecule.atoms) - principal_axes = molecule.principal_axes() + principal_axes = self.get_principal_axes(molecule) eigenvalues, _ = np.linalg.eigh(moment_of_inertia_tensor) order = np.argsort(np.abs(eigenvalues))[::-1] @@ -1113,6 +1113,34 @@ def get_custom_principal_axes( return principal_axes, moment_of_inertia + def get_principal_axes(self, group, wrap: bool = False) -> np.ndarray: + """Compute the principal axes of an atom group from its moment of inertia. + + Uses ``np.linalg.eigh`` rather than ``np.linalg.eig``. The moment of inertia + tensor is symmetric, so ``eigh`` returns orthonormal axes, whereas ``eig`` + can return skewed axes for (near-)degenerate moments. + + - Axes are sorted by descending (signed) eigenvalue and returned as rows. + - If the axes are left-handed, all three are flipped. + + Args: + group: Atom group (or anything with ``.atoms``). + wrap: Whether to wrap atoms into the primary unit cell before computing + the moment of inertia. + + Returns: + np.ndarray: (3, 3) principal axes (rows). + """ + atomgroup = group.atoms + e_val, e_vec = np.linalg.eigh(atomgroup.moment_of_inertia(wrap=wrap)) + + e_vec = e_vec[:, np.argsort(e_val)[::-1]].T + + if np.dot(np.cross(e_vec[0], e_vec[1]), e_vec[2]) < 0: + e_vec *= -1 + + return e_vec + def get_UA_masses(self, molecule) -> list[float]: """Return united-atom (UA) masses for a molecule. diff --git a/CodeEntropy/levels/nodes/covariance.py b/CodeEntropy/levels/nodes/covariance.py index 9ea5ea40..2fa5c2ee 100644 --- a/CodeEntropy/levels/nodes/covariance.py +++ b/CodeEntropy/levels/nodes/covariance.py @@ -506,7 +506,7 @@ def _build_ua_vectors( # principal axes make_whole(residue.atoms) make_whole(bead) - trans_axes = residue.atoms.principal_axes() + trans_axes = axes_manager.get_principal_axes(residue.atoms) rot_axes, moi = axes_manager.get_vanilla_axes(bead) center = bead.center_of_mass(unwrap=True) @@ -658,7 +658,7 @@ def _get_residue_axes( make_whole(mol.atoms) make_whole(bead) - trans_axes = mol.atoms.principal_axes() + trans_axes = axes_manager.get_principal_axes(mol.atoms) rot_axes, moi = axes_manager.get_vanilla_axes(bead) center = bead.center_of_mass(unwrap=True) return ( @@ -688,7 +688,7 @@ def _get_polymer_axes( make_whole(mol.atoms) make_whole(bead) - trans_axes = mol.atoms.principal_axes() + trans_axes = axes_manager.get_principal_axes(mol.atoms) rot_axes, moi = axes_manager.get_vanilla_axes(bead) center = bead.center_of_mass(unwrap=True) From 67eb2a5050031dd411351041b88f081ef2433a15 Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Wed, 7 Oct 2026 14:48:28 +0100 Subject: [PATCH 03/12] tests(unit): update axes unit tests to use eigh-based principal axes --- .../levels/nodes/test_covariance_node.py | 3 + tests/unit/CodeEntropy/levels/test_axes.py | 87 +++++++++++++++---- 2 files changed, 72 insertions(+), 18 deletions(-) diff --git a/tests/unit/CodeEntropy/levels/nodes/test_covariance_node.py b/tests/unit/CodeEntropy/levels/nodes/test_covariance_node.py index 19ed3813..96375714 100644 --- a/tests/unit/CodeEntropy/levels/nodes/test_covariance_node.py +++ b/tests/unit/CodeEntropy/levels/nodes/test_covariance_node.py @@ -501,6 +501,7 @@ def test_build_ua_vectors_uses_vanilla_axes_when_not_customised(): np.eye(3), np.array([1.0, 2.0, 3.0]), ) + axes_manager.get_principal_axes.return_value = np.eye(3) node._ft.get_weighted_forces = MagicMock(return_value=np.array([1.0, 0.0, 0.0])) node._ft.get_weighted_torques = MagicMock(return_value=np.array([0.0, 1.0, 0.0])) @@ -623,6 +624,7 @@ def test_get_residue_axes_vanilla_uses_make_whole_and_vanilla_axes(): np.eye(3), np.array([1.0, 2.0, 3.0]), ) + axes_manager.get_principal_axes.return_value = np.eye(3) with patch("CodeEntropy.levels.nodes.covariance.make_whole") as make_whole: trans_axes, rot_axes, center, moi = node._get_residue_axes( @@ -654,6 +656,7 @@ def test_get_polymer_axes_uses_make_whole_and_vanilla_axes(): np.eye(3), np.array([1.0, 2.0, 3.0]), ) + axes_manager.get_principal_axes.return_value = np.eye(3) with patch("CodeEntropy.levels.nodes.covariance.make_whole") as make_whole: trans_axes, rot_axes, center, moi = node._get_polymer_axes( diff --git a/tests/unit/CodeEntropy/levels/test_axes.py b/tests/unit/CodeEntropy/levels/test_axes.py index 2b856a08..8c5c58be 100644 --- a/tests/unit/CodeEntropy/levels/test_axes.py +++ b/tests/unit/CodeEntropy/levels/test_axes.py @@ -327,7 +327,7 @@ def test_get_vanilla_axes_sorts_eigenvalues_desc_by_abs(monkeypatch): mol = MagicMock() moi_tensor = np.diag([1.0, -10.0, 3.0]) mol.moment_of_inertia.return_value = moi_tensor - mol.principal_axes.return_value = np.eye(3) + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) mol.atoms = MagicMock() # avoid real MDAnalysis unwrap @@ -340,6 +340,58 @@ def test_get_vanilla_axes_sorts_eigenvalues_desc_by_abs(monkeypatch): assert np.allclose(moments, np.array([-10.0, 3.0, 1.0])) +def test_get_principal_axes_sorts_by_descending_eigenvalue(): + ax = AxesCalculator() + group = MagicMock() + group.atoms.moment_of_inertia.return_value = np.diag([1.0, 3.0, 2.0]) + + axes = ax.get_principal_axes(group) + + # eigenvalues 3, 2, 1 => rows along y, z, x (sign may differ) + expected = np.array([[0, 1, 0], [0, 0, 1], [1, 0, 0]], dtype=float) + assert np.allclose(np.abs(axes), expected) + + +def test_get_principal_axes_orthonormal_and_right_handed_for_near_degenerate(): + ax = AxesCalculator() + rng = np.random.default_rng(0) + q, _ = np.linalg.qr(rng.normal(size=(3, 3))) + tensor = q @ np.diag([1.0, 1.0 + 1e-9, 5.0]) @ q.T + group = MagicMock() + group.atoms.moment_of_inertia.return_value = tensor + + axes = ax.get_principal_axes(group) + + assert np.allclose(axes @ axes.T, np.eye(3), atol=1e-12) + assert np.isclose(np.linalg.det(axes), 1.0) + assert np.isclose(abs(np.dot(axes[0], q[:, 2])), 1.0) + + +def test_get_principal_axes_flips_all_axes_when_left_handed(monkeypatch): + ax = AxesCalculator() + group = MagicMock() + group.atoms.moment_of_inertia.return_value = np.eye(3) + monkeypatch.setattr( + np.linalg, "eigh", lambda _m: (np.array([1.0, 2.0, 3.0]), np.eye(3)) + ) + + axes = ax.get_principal_axes(group) + + # descending order gives rows e3, e2, e1 (left-handed), so all are negated + expected = -np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]], dtype=float) + assert np.allclose(axes, expected) + + +def test_get_principal_axes_passes_wrap_to_moment_of_inertia(): + ax = AxesCalculator() + group = MagicMock() + group.atoms.moment_of_inertia.return_value = np.diag([3.0, 2.0, 1.0]) + + ax.get_principal_axes(group, wrap=True) + + group.atoms.moment_of_inertia.assert_called_once_with(wrap=True) + + def test_find_bonded_atoms_selects_heavy_and_hydrogen_groups(): ax = AxesCalculator() @@ -626,6 +678,7 @@ def test_get_custom_moment_of_inertia_len2_zeros_smallest_component(): def test_get_UA_axes_multiple_heavy_atoms_uses_custom_principal_axes(monkeypatch): ax = AxesCalculator() + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) heavy_atoms = _FakeAtomGroup( [ @@ -647,9 +700,6 @@ def center_of_mass(self, *args, **kwargs): def __getitem__(self, idx): return system_atom - def principal_axes(self, *args, **kwargs): - return np.eye(3) - def select_atoms(self, q): if q == "mass 2 to 999": return heavy_atoms @@ -839,7 +889,8 @@ def test_get_residue_axes_from_topology_neighbor_bonds_uses_vanilla_axes( dimensions=[11.0, 12.0, 13.0, 90.0, 90.0, 90.0], ) mol = MagicMock() - mol.atoms.principal_axes.return_value = np.eye(3) * 5.0 + get_principal = MagicMock(return_value=np.eye(3) * 5.0) + monkeypatch.setattr(ax, "get_principal_axes", get_principal) residue_atoms = MagicMock() residue_atoms.center_of_mass.return_value = np.array([1.0, 2.0, 3.0]) topology = _residue_topology(has_neighbor_bonds=True) @@ -859,7 +910,7 @@ def test_get_residue_axes_from_topology_neighbor_bonds_uses_vanilla_axes( ) make_whole.assert_called_once_with(mol.atoms) - mol.atoms.principal_axes.assert_called_once() + get_principal.assert_called_once() get_vanilla.assert_called_once_with(residue_atoms) np.testing.assert_allclose(trans_axes, np.eye(3) * 5.0) np.testing.assert_allclose(rot_axes, np.eye(3) * 6.0) @@ -936,7 +987,8 @@ def test_get_UA_axes_from_topology_single_heavy_uses_residue_principal_axes( {1: heavy_atom}, dimensions=[11.0, 12.0, 13.0, 90.0, 90.0, 90.0] ) residue_atoms = MagicMock() - residue_atoms.principal_axes.return_value = np.eye(3) * 5.0 + get_principal = MagicMock(return_value=np.eye(3) * 5.0) + monkeypatch.setattr(ax, "get_principal_axes", get_principal) topology = _ua_topology(heavy_atom_index=1, residue_heavy_indices=(1,)) @@ -954,7 +1006,7 @@ def test_get_UA_axes_from_topology_single_heavy_uses_residue_principal_axes( ) make_whole.assert_called_once_with(residue_atoms) - residue_atoms.principal_axes.assert_called_once() + get_principal.assert_called_once() np.testing.assert_allclose(trans_axes, np.eye(3) * 5.0) np.testing.assert_allclose(rot_axes, np.eye(3) * 6.0) np.testing.assert_allclose(center, heavy_atom.position) @@ -972,7 +1024,7 @@ def test_get_UA_axes_from_topology_raises_when_cached_bonded_axes_fail(monkeypat heavy_atom = _FakeAtom(1, 12.0, [1.0, 0.0, 0.0]) universe = _FakeUniverse({1: heavy_atom}) residue_atoms = MagicMock() - residue_atoms.principal_axes.return_value = np.eye(3) + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) topology = _ua_topology(heavy_atom_index=1, residue_heavy_indices=(1,)) monkeypatch.setattr("CodeEntropy.levels.axes.make_whole", lambda _ag: None) @@ -1282,7 +1334,7 @@ def _select_atoms(q): return edge_atom_set u.atoms.select_atoms.side_effect = _select_atoms - u.atoms.principal_axes.return_value = np.eye(3) + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) monkeypatch.setattr(ax, "get_chain", lambda residue, first, last: [backbone_atom]) monkeypatch.setattr( ax, @@ -1328,7 +1380,7 @@ def _select_atoms(q): return edge_atom_set u.atoms.select_atoms.side_effect = _select_atoms - u.atoms.principal_axes.return_value = np.eye(3) + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) monkeypatch.setattr( ax, "get_chain", lambda residue, edge_atom_1, edge_atom_2: backbone_atoms ) @@ -1376,7 +1428,7 @@ def _select_atoms(q): if q.startswith("resindex 0 and (bonded resindex"): return [uas[2]] - u.atoms.principal_axes.return_value = np.eye(3) + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) u.atoms.select_atoms.side_effect = _select_atoms residue.select_atoms.side_effect = _select_atoms residue.atoms.select_atoms.side_effect = _select_atoms @@ -1758,7 +1810,7 @@ def test_get_residue_axes_non_terminal_2_atoms(monkeypatch): monkeypatch.setattr("CodeEntropy.levels.axes.make_whole", lambda _ag: None) residue = u.select_atoms("resindex 5") residue.__len__.return_value = 2 - u.atoms.principal_axes.return_value = np.eye(3) + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) uas = _FakeAtomGroup( [ _atom(index=0, mass=12.0, pos=(1, 1, 1)), @@ -1812,7 +1864,7 @@ def test_get_residue_axes_terminal_2_atoms(monkeypatch): _atom(index=2, mass=12.0, pos=(0, 0, 1)), ], ) - u.atoms.principal_axes.return_value = np.eye(3) + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) def _select_atoms(q): if q == "mass 2 to 999": @@ -1859,8 +1911,7 @@ def test_get_res_axes_terminal_1_atom(monkeypatch): _atom(index=0, mass=12.0, pos=(1, 0, 0)), ], ) - u.atoms.principal_axes.return_value = np.eye(3) - residue.atoms.principal_axes.return_value = np.eye(3) + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) def _select_atoms(q): if q == "mass 2 to 999": @@ -1929,7 +1980,7 @@ def _select_atoms_residue(q): "get_bonded_axes", lambda system, atom, dimensions: (np.eye(3), 3 * np.eye(3)), ) - residue.atoms.principal_axes.return_value = 2 * np.eye(3) + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: 2 * np.eye(3)) trans_axes, rot_axes, rot_center, moi = ax.get_UA_axes( data_container=residue_group, index=0, res_position=-1 @@ -1958,7 +2009,7 @@ def _select_atoms(q): return [] residue.atoms.select_atoms.side_effect = _select_atoms - residue.atoms.principal_axes.return_value = np.eye(3) + monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) centre, axes = ax.get_terminal_axes( residue, heavy_atoms[0], dimensions=np.array([1, 1, 1]) ) From 6e68b7456457f72e5616e8c8119c0ea413e9a968 Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Wed, 7 Oct 2026 16:40:48 +0100 Subject: [PATCH 04/12] tests(regression): update regression baselines to use eigh-based principal axes --- .../baselines/benzaldehyde/axes_off.json | 10 ++-- .../combined_forcetorque_false.json | 10 ++-- .../baselines/benzaldehyde/frame_window.json | 10 ++-- .../baselines/benzaldehyde/grouping_each.json | 24 ++++----- .../benzaldehyde/selection_subset.json | 10 ++-- .../baselines/benzene/axes_off.json | 10 ++-- .../benzene/combined_forcetorque_off.json | 10 ++-- .../baselines/benzene/frame_window.json | 10 ++-- .../baselines/benzene/grouping_each.json | 48 ++++++++--------- .../baselines/benzene/selection_subset.json | 10 ++-- .../baselines/cyclohexane/axes_off.json | 10 ++-- .../cyclohexane/combined_forcetorque_off.json | 8 +-- .../baselines/cyclohexane/frame_window.json | 10 ++-- .../baselines/cyclohexane/grouping_each.json | 38 +++++++------- .../cyclohexane/selection_subset.json | 8 +-- tests/regression/baselines/dna/axes_off.json | 16 +++--- .../dna/combined_forcetorque_off.json | 20 +++---- .../baselines/dna/frame_window.json | 16 +++--- .../baselines/dna/grouping_each.json | 14 ++--- .../baselines/dna/selection_subset.json | 14 ++--- .../baselines/ethyl-acetate/axes_off.json | 10 ++-- .../combined_forcetorque_off.json | 10 ++-- .../baselines/ethyl-acetate/frame_window.json | 10 ++-- .../ethyl-acetate/grouping_each.json | 36 ++++++------- .../ethyl-acetate/selection_subset.json | 10 ++-- .../baselines/methane/axes_off.json | 6 +-- .../methane/combined_forcetorque_off.json | 6 +-- .../baselines/methane/frame_window.json | 6 +-- .../baselines/methane/grouping_each.json | 52 +++++++++---------- .../baselines/methane/selection_subset.json | 6 +-- .../baselines/methanol/axes_off.json | 8 +-- .../methanol/combined_forcetorque_off.json | 8 +-- .../baselines/methanol/frame_window.json | 6 +-- .../baselines/methanol/grouping_each.json | 42 +++++++-------- .../baselines/methanol/selection_subset.json | 8 +-- .../baselines/octonol/axes_off.json | 10 ++-- .../octonol/combined_forcetorque_off.json | 10 ++-- .../baselines/octonol/frame_window.json | 10 ++-- .../baselines/octonol/grouping_each.json | 38 +++++++------- .../baselines/octonol/selection_subset.json | 10 ++-- .../regression/baselines/water/axes_off.json | 6 +-- .../water/combined_forcetorque_off.json | 6 +-- .../baselines/water/frame_window.json | 6 +-- .../baselines/water/grouping_each.json | 46 ++++++++-------- .../baselines/water/selection_subset.json | 6 +-- .../regression/baselines/water/water_off.json | 6 +-- 46 files changed, 342 insertions(+), 342 deletions(-) diff --git a/tests/regression/baselines/benzaldehyde/axes_off.json b/tests/regression/baselines/benzaldehyde/axes_off.json index 5bddd538..0d34d6c5 100644 --- a/tests/regression/baselines/benzaldehyde/axes_off.json +++ b/tests/regression/baselines/benzaldehyde/axes_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.08982962903796131, - "united_atom:Rovibrational": 32.16018134884085, - "residue:FTmat-Transvibrational": 88.7671666695003, - "residue:FTmat-Rovibrational": 61.61036267672132, + "united_atom:Transvibrational": 0.059408867580823616, + "united_atom:Rovibrational": 39.36932344859785, + "residue:FTmat-Transvibrational": 81.48352353795262, + "residue:FTmat-Rovibrational": 63.04898043265405, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 20.481571492615355 }, - "total": 203.1091118167158 + "total": 204.44280777940068 } } } diff --git a/tests/regression/baselines/benzaldehyde/combined_forcetorque_false.json b/tests/regression/baselines/benzaldehyde/combined_forcetorque_false.json index a5d1af0e..66c2f7ce 100644 --- a/tests/regression/baselines/benzaldehyde/combined_forcetorque_false.json +++ b/tests/regression/baselines/benzaldehyde/combined_forcetorque_false.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.07119323721997475, - "united_atom:Rovibrational": 49.68669738152346, - "residue:Transvibrational": 69.48692941204929, - "residue:Rovibrational": 68.46147102540942, + "united_atom:Transvibrational": 0.05129761410051273, + "united_atom:Rovibrational": 49.686697381523466, + "residue:Transvibrational": 69.21750344995603, + "residue:Rovibrational": 67.99888878209293, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 20.481571492615355 }, - "total": 208.1878625488175 + "total": 207.4359587202883 } } } diff --git a/tests/regression/baselines/benzaldehyde/frame_window.json b/tests/regression/baselines/benzaldehyde/frame_window.json index 70bb2766..9f7e948e 100644 --- a/tests/regression/baselines/benzaldehyde/frame_window.json +++ b/tests/regression/baselines/benzaldehyde/frame_window.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 40.30267601961045, - "united_atom:Rovibrational": 38.21906858443615, - "residue:FTmat-Transvibrational": 73.41098578352612, - "residue:FTmat-Rovibrational": 57.881504393660364, + "united_atom:Transvibrational": 42.23402688550062, + "united_atom:Rovibrational": 38.219068584436165, + "residue:FTmat-Transvibrational": 73.4310301096772, + "residue:FTmat-Rovibrational": 57.470843728209715, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 20.481571492615355 }, - "total": 230.29580627384846 + "total": 231.83654080043905 } } } diff --git a/tests/regression/baselines/benzaldehyde/grouping_each.json b/tests/regression/baselines/benzaldehyde/grouping_each.json index deacf42c..50a38c1e 100644 --- a/tests/regression/baselines/benzaldehyde/grouping_each.json +++ b/tests/regression/baselines/benzaldehyde/grouping_each.json @@ -40,61 +40,61 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.001983835543157824, - "residue:FTmat-Transvibrational": 15.803976930845373, + "residue:FTmat-Transvibrational": 15.80397693084538, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 15.80596076638853 + "total": 15.805960766388537 }, "4": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.003874883925216773, - "residue:FTmat-Transvibrational": 23.899916844406114, + "residue:FTmat-Transvibrational": 23.899916844406135, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 23.90379172833133 + "total": 23.903791728331353 }, "5": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.010824819910336868, - "residue:FTmat-Transvibrational": 11.05479779559611, + "residue:FTmat-Transvibrational": 11.054797795596109, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 31.909265242174982 }, - "total": 42.97488785768143 + "total": 42.97488785768142 }, "6": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00018982532508837537, - "residue:FTmat-Transvibrational": 19.723925127490933, + "residue:FTmat-Transvibrational": 19.72392512749092, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 19.72411495281602 + "total": 19.724114952816006 }, "7": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.004033941970593011, - "residue:FTmat-Transvibrational": 18.90676882142135, + "residue:FTmat-Transvibrational": 18.906768821421363, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 18.910802763391942 + "total": 18.910802763391956 }, "8": { "components": { @@ -112,13 +112,13 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00023139743934636996, - "residue:FTmat-Transvibrational": 21.42548529236268, + "residue:FTmat-Transvibrational": 21.42548529236267, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 21.425716689802027 + "total": 21.425716689802016 } } } diff --git a/tests/regression/baselines/benzaldehyde/selection_subset.json b/tests/regression/baselines/benzaldehyde/selection_subset.json index 6d50b1a7..5b95eece 100644 --- a/tests/regression/baselines/benzaldehyde/selection_subset.json +++ b/tests/regression/baselines/benzaldehyde/selection_subset.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.07119323721997475, - "united_atom:Rovibrational": 49.68669738152346, - "residue:FTmat-Transvibrational": 87.43527331108173, - "residue:FTmat-Rovibrational": 61.67126452972779, + "united_atom:Transvibrational": 0.05129761410051273, + "united_atom:Rovibrational": 49.686697381523466, + "residue:FTmat-Transvibrational": 82.05934573652353, + "residue:FTmat-Rovibrational": 61.71704168262333, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 20.481571492615355 }, - "total": 219.34599995216834 + "total": 213.99595390738622 } } } diff --git a/tests/regression/baselines/benzene/axes_off.json b/tests/regression/baselines/benzene/axes_off.json index 6177e0d0..109194ee 100644 --- a/tests/regression/baselines/benzene/axes_off.json +++ b/tests/regression/baselines/benzene/axes_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.17824017761231503, - "united_atom:Rovibrational": 37.12706256545503, - "residue:FTmat-Transvibrational": 76.8200637641939, - "residue:FTmat-Rovibrational": 47.171663134129304, + "united_atom:Transvibrational": 0.16163858692459776, + "united_atom:Rovibrational": 44.48477691495675, + "residue:FTmat-Transvibrational": 81.11811255841327, + "residue:FTmat-Rovibrational": 47.03606119622739, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 161.29702964139057 + "total": 172.80058925652202 } } } diff --git a/tests/regression/baselines/benzene/combined_forcetorque_off.json b/tests/regression/baselines/benzene/combined_forcetorque_off.json index 16b5e375..3785730a 100644 --- a/tests/regression/baselines/benzene/combined_forcetorque_off.json +++ b/tests/regression/baselines/benzene/combined_forcetorque_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.16311383522946216, - "united_atom:Rovibrational": 40.695812407899396, - "residue:Transvibrational": 57.59675197041957, - "residue:Rovibrational": 52.85496348419672, + "united_atom:Transvibrational": 0.1627566521736012, + "united_atom:Rovibrational": 40.69581240789943, + "residue:Transvibrational": 61.39556854139587, + "residue:Rovibrational": 49.491721969907516, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 151.31064169774515 + "total": 151.7458595713764 } } } diff --git a/tests/regression/baselines/benzene/frame_window.json b/tests/regression/baselines/benzene/frame_window.json index c1ffd000..c12b13b5 100644 --- a/tests/regression/baselines/benzene/frame_window.json +++ b/tests/regression/baselines/benzene/frame_window.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 11.46552036084548, - "united_atom:Rovibrational": 34.98492056748493, - "residue:FTmat-Transvibrational": 71.83491878606151, - "residue:FTmat-Rovibrational": 55.6098400281744, + "united_atom:Transvibrational": 12.892173028619528, + "united_atom:Rovibrational": 34.98492056748487, + "residue:FTmat-Transvibrational": 71.74602192596502, + "residue:FTmat-Rovibrational": 55.81007796948714, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 173.89519974256632 + "total": 175.43319349155655 } } } diff --git a/tests/regression/baselines/benzene/grouping_each.json b/tests/regression/baselines/benzene/grouping_each.json index 36535d8f..d6460fc6 100644 --- a/tests/regression/baselines/benzene/grouping_each.json +++ b/tests/regression/baselines/benzene/grouping_each.json @@ -4,121 +4,121 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.001760679467943202, - "residue:FTmat-Transvibrational": 19.14539159233644, + "residue:FTmat-Transvibrational": 19.145391592336434, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 19.147152271804384 + "total": 19.147152271804377 }, "1": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.010093246924291187, - "residue:FTmat-Transvibrational": 15.27551568157708, + "united_atom:Rovibrational": 0.010093246924291217, + "residue:FTmat-Transvibrational": 15.27551568157707, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 15.089233620075317 }, - "total": 30.374842548576687 + "total": 30.37484254857668 }, "2": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.07511923174012403, - "residue:FTmat-Transvibrational": 20.327785240055736, + "residue:FTmat-Transvibrational": 20.32778524005574, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 15.089233620075317 }, - "total": 35.492138091871176 + "total": 35.49213809187118 }, "3": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.0038209327718877325, - "residue:FTmat-Transvibrational": 9.934141461042111, + "united_atom:Rovibrational": 0.003820932771887749, + "residue:FTmat-Transvibrational": 9.934141461042106, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 9.937962393813999 + "total": 9.937962393813994 }, "4": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.026349364088976555, - "residue:FTmat-Transvibrational": 7.206801915761131, + "residue:FTmat-Transvibrational": 7.206801915761134, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 7.233151279850108 + "total": 7.2331512798501105 }, "5": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0015259047993877776, - "residue:FTmat-Transvibrational": 8.539848138171388, + "residue:FTmat-Transvibrational": 8.539848138171394, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 8.541374042970777 + "total": 8.541374042970782 }, "6": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0034710297151557107, - "residue:FTmat-Transvibrational": 15.469059953010003, + "residue:FTmat-Transvibrational": 15.46905995300999, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 15.472530982725159 + "total": 15.472530982725146 }, "7": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.004204931339708972, - "residue:FTmat-Transvibrational": 7.333010865090827, + "united_atom:Rovibrational": 0.004204931339708978, + "residue:FTmat-Transvibrational": 7.333010865090829, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 7.337215796430536 + "total": 7.337215796430538 }, "8": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.0006818502219972305, - "residue:FTmat-Transvibrational": 22.685475655857566, + "united_atom:Rovibrational": 0.0006818502219972316, + "residue:FTmat-Transvibrational": 22.685475655857545, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 22.686157506079564 + "total": 22.686157506079542 }, "9": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.004115086801073575, - "residue:FTmat-Transvibrational": 5.894912294581263, + "residue:FTmat-Transvibrational": 5.894912294581267, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 5.899027381382337 + "total": 5.89902738138234 } } } diff --git a/tests/regression/baselines/benzene/selection_subset.json b/tests/regression/baselines/benzene/selection_subset.json index ff2d09b5..6845abae 100644 --- a/tests/regression/baselines/benzene/selection_subset.json +++ b/tests/regression/baselines/benzene/selection_subset.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.16311383522946216, - "united_atom:Rovibrational": 40.695812407899396, - "residue:FTmat-Transvibrational": 71.15771063929333, - "residue:FTmat-Rovibrational": 47.26253953880574, + "united_atom:Transvibrational": 0.1627566521736012, + "united_atom:Rovibrational": 40.69581240789943, + "residue:FTmat-Transvibrational": 83.31956662877224, + "residue:FTmat-Rovibrational": 45.37364572273796, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 159.27917642122793 + "total": 169.55178141158322 } } } diff --git a/tests/regression/baselines/cyclohexane/axes_off.json b/tests/regression/baselines/cyclohexane/axes_off.json index 5bf80282..2d6038ac 100644 --- a/tests/regression/baselines/cyclohexane/axes_off.json +++ b/tests/regression/baselines/cyclohexane/axes_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.6825851535582973, - "united_atom:Rovibrational": 22.069351988995066, - "residue:FTmat-Transvibrational": 85.12666483486655, - "residue:FTmat-Rovibrational": 61.14255319533254, + "united_atom:Transvibrational": 0.8231608488813442, + "united_atom:Rovibrational": 24.640396903026634, + "residue:FTmat-Transvibrational": 84.05755363684698, + "residue:FTmat-Rovibrational": 61.73316378799838, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 169.02115517275246 + "total": 171.2542751767533 } } } diff --git a/tests/regression/baselines/cyclohexane/combined_forcetorque_off.json b/tests/regression/baselines/cyclohexane/combined_forcetorque_off.json index a548349d..0a2e066f 100644 --- a/tests/regression/baselines/cyclohexane/combined_forcetorque_off.json +++ b/tests/regression/baselines/cyclohexane/combined_forcetorque_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.5949308536734588, + "united_atom:Transvibrational": 0.9083882969602073, "united_atom:Rovibrational": 24.234154676578637, - "residue:Transvibrational": 69.9872567772153, - "residue:Rovibrational": 68.68521019685565, + "residue:Transvibrational": 70.36545739512636, + "residue:Rovibrational": 69.36129379657234, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 163.50155250432303 + "total": 164.86929416523753 } } } diff --git a/tests/regression/baselines/cyclohexane/frame_window.json b/tests/regression/baselines/cyclohexane/frame_window.json index d21d437d..dfe949a7 100644 --- a/tests/regression/baselines/cyclohexane/frame_window.json +++ b/tests/regression/baselines/cyclohexane/frame_window.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 17.398382397359153, - "united_atom:Rovibrational": 73.96792995794405, - "residue:FTmat-Transvibrational": 76.4267996157354, - "residue:FTmat-Rovibrational": 63.30469126284744, + "united_atom:Transvibrational": 19.83149926936752, + "united_atom:Rovibrational": 73.96792995794401, + "residue:FTmat-Transvibrational": 76.41867545283402, + "residue:FTmat-Rovibrational": 63.268579628257925, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 231.09780323388605 + "total": 233.48668430840345 } } } diff --git a/tests/regression/baselines/cyclohexane/grouping_each.json b/tests/regression/baselines/cyclohexane/grouping_each.json index 364af0c5..f48d5fac 100644 --- a/tests/regression/baselines/cyclohexane/grouping_each.json +++ b/tests/regression/baselines/cyclohexane/grouping_each.json @@ -4,73 +4,73 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0010533914066148877, - "residue:FTmat-Transvibrational": 13.254094261168165, + "residue:FTmat-Transvibrational": 13.25409426116816, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 13.25514765257478 + "total": 13.255147652574774 }, "1": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.006057157987386287, - "residue:FTmat-Transvibrational": 15.132575979975469, + "residue:FTmat-Transvibrational": 15.132575979975476, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 15.138633137962856 + "total": 15.138633137962863 }, "2": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00010095873425357108, - "residue:FTmat-Transvibrational": 19.65885364120911, + "residue:FTmat-Transvibrational": 19.658853641209102, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 19.658954599943364 + "total": 19.658954599943357 }, "3": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.0037293322355179776, - "residue:FTmat-Transvibrational": 11.234013572018538, + "united_atom:Rovibrational": 0.0037293322355179833, + "residue:FTmat-Transvibrational": 11.234013572018535, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 11.237742904254056 + "total": 11.237742904254052 }, "4": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0007550734967943642, - "residue:FTmat-Transvibrational": 18.70372633557293, + "residue:FTmat-Transvibrational": 18.703726335572917, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 18.704481409069725 + "total": 18.70448140906971 }, "5": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.02179378230989012, - "residue:FTmat-Transvibrational": 11.909227365464751, + "residue:FTmat-Transvibrational": 11.90922736546474, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 11.931021147774642 + "total": 11.931021147774631 }, "6": { "components": { @@ -88,37 +88,37 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.007825221576786185, - "residue:FTmat-Transvibrational": 14.390570450399677, + "residue:FTmat-Transvibrational": 14.390570450399672, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 14.398395671976463 + "total": 14.398395671976457 }, "8": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00022218804178093966, - "residue:FTmat-Transvibrational": 15.08891414424032, + "residue:FTmat-Transvibrational": 15.088914144240295, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 15.0891363322821 + "total": 15.089136332282076 }, "9": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.015106344919667631, - "residue:FTmat-Transvibrational": 15.248584501782126, + "residue:FTmat-Transvibrational": 15.248584501782135, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 15.263690846701794 + "total": 15.263690846701802 } } } diff --git a/tests/regression/baselines/cyclohexane/selection_subset.json b/tests/regression/baselines/cyclohexane/selection_subset.json index b1a14443..c4297f30 100644 --- a/tests/regression/baselines/cyclohexane/selection_subset.json +++ b/tests/regression/baselines/cyclohexane/selection_subset.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.5949308536734588, + "united_atom:Transvibrational": 0.9083882969602073, "united_atom:Rovibrational": 24.234154676578637, - "residue:FTmat-Transvibrational": 84.37184730911717, - "residue:FTmat-Rovibrational": 59.52377096811085, + "residue:FTmat-Transvibrational": 83.02143938359535, + "residue:FTmat-Rovibrational": 60.38982276412395, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 168.72470380748013 + "total": 168.55380512125814 } } } diff --git a/tests/regression/baselines/dna/axes_off.json b/tests/regression/baselines/dna/axes_off.json index 9504b7b5..6a9dab72 100644 --- a/tests/regression/baselines/dna/axes_off.json +++ b/tests/regression/baselines/dna/axes_off.json @@ -3,30 +3,30 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 1.2269044878385265, + "united_atom:Rovibrational": 1.2910746542567035, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 27.45710747332319, - "polymer:FTmat-Transvibrational": 48.62026970762269, + "residue:Rovibrational": 26.68254629775581, + "polymer:FTmat-Transvibrational": 48.50274293414517, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 10.584542990557836, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 92.64772999596995 + "total": 91.81981221334323 }, "1": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 1.7972774672527945, + "united_atom:Rovibrational": 1.9680216598831306, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 25.287669468441067, - "polymer:FTmat-Transvibrational": 60.47397935339153, + "residue:Rovibrational": 24.831990780037884, + "polymer:FTmat-Transvibrational": 57.35678551116436, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 5.292271495278918, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 97.61010312099201 + "total": 94.207974782992 } } } diff --git a/tests/regression/baselines/dna/combined_forcetorque_off.json b/tests/regression/baselines/dna/combined_forcetorque_off.json index e867cee1..339a1632 100644 --- a/tests/regression/baselines/dna/combined_forcetorque_off.json +++ b/tests/regression/baselines/dna/combined_forcetorque_off.json @@ -3,30 +3,30 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.002160679012128457, + "united_atom:Rovibrational": 0.0021606790121284584, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 3.376800684085249, - "polymer:Transvibrational": 21.18266215491188, - "polymer:Rovibrational": 12.837576042626923, + "residue:Rovibrational": 3.3768006840852487, + "polymer:Transvibrational": 21.182662154911913, + "polymer:Rovibrational": 12.837576042626926, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 42.1581048972639 + "total": 42.15810489726393 }, "1": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.01846427765949586, + "united_atom:Rovibrational": 0.01846427765949588, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 2.3863201082544565, - "polymer:Transvibrational": 16.607667396609116, - "polymer:Rovibrational": 12.304363914795593, + "residue:Rovibrational": 2.386320108254459, + "polymer:Transvibrational": 16.607667396609127, + "polymer:Rovibrational": 12.304363914795598, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 36.07572103394637 + "total": 36.075721033946394 } } } diff --git a/tests/regression/baselines/dna/frame_window.json b/tests/regression/baselines/dna/frame_window.json index c35d2211..82811387 100644 --- a/tests/regression/baselines/dna/frame_window.json +++ b/tests/regression/baselines/dna/frame_window.json @@ -3,30 +3,30 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 1.5821720528374943, + "united_atom:Rovibrational": 1.5821720528374947, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 27.397449238560412, - "polymer:FTmat-Transvibrational": 48.62026970762269, + "residue:Rovibrational": 26.60656641113743, + "polymer:FTmat-Transvibrational": 48.50274293414517, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 10.584542990557836, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 92.94333932620614 + "total": 92.03492972530563 }, "1": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 2.5277936366208014, + "united_atom:Rovibrational": 2.527793636620802, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 24.80670067454149, - "polymer:FTmat-Transvibrational": 60.47397935339153, + "residue:Rovibrational": 24.4275653595082, + "polymer:FTmat-Transvibrational": 57.35678551116436, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 5.292271495278918, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 97.85965049646045 + "total": 94.3633213392 } } } diff --git a/tests/regression/baselines/dna/grouping_each.json b/tests/regression/baselines/dna/grouping_each.json index 2cbef740..1e29fb1c 100644 --- a/tests/regression/baselines/dna/grouping_each.json +++ b/tests/regression/baselines/dna/grouping_each.json @@ -3,10 +3,10 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.002160679012128457, + "united_atom:Rovibrational": 0.0021606790121284584, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 3.376800684085249, - "polymer:FTmat-Transvibrational": 12.341104347192612, + "residue:Rovibrational": 3.3768006840852487, + "polymer:FTmat-Transvibrational": 12.341104347192614, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, @@ -17,16 +17,16 @@ "1": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.01846427765949586, + "united_atom:Rovibrational": 0.01846427765949588, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 2.3863201082544565, - "polymer:FTmat-Transvibrational": 11.11037253388596, + "residue:Rovibrational": 2.386320108254459, + "polymer:FTmat-Transvibrational": 11.110372533885968, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 18.274062256427623 + "total": 18.274062256427637 } } } diff --git a/tests/regression/baselines/dna/selection_subset.json b/tests/regression/baselines/dna/selection_subset.json index 2cbef740..1e29fb1c 100644 --- a/tests/regression/baselines/dna/selection_subset.json +++ b/tests/regression/baselines/dna/selection_subset.json @@ -3,10 +3,10 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.002160679012128457, + "united_atom:Rovibrational": 0.0021606790121284584, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 3.376800684085249, - "polymer:FTmat-Transvibrational": 12.341104347192612, + "residue:Rovibrational": 3.3768006840852487, + "polymer:FTmat-Transvibrational": 12.341104347192614, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, @@ -17,16 +17,16 @@ "1": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.01846427765949586, + "united_atom:Rovibrational": 0.01846427765949588, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 2.3863201082544565, - "polymer:FTmat-Transvibrational": 11.11037253388596, + "residue:Rovibrational": 2.386320108254459, + "polymer:FTmat-Transvibrational": 11.110372533885968, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 18.274062256427623 + "total": 18.274062256427637 } } } diff --git a/tests/regression/baselines/ethyl-acetate/axes_off.json b/tests/regression/baselines/ethyl-acetate/axes_off.json index 4c28d3bd..b501e824 100644 --- a/tests/regression/baselines/ethyl-acetate/axes_off.json +++ b/tests/regression/baselines/ethyl-acetate/axes_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.8081103094129065, - "united_atom:Rovibrational": 68.85184585731292, - "residue:FTmat-Transvibrational": 77.33844477785695, - "residue:FTmat-Rovibrational": 56.03921993686319, + "united_atom:Transvibrational": 1.0264523212404142, + "united_atom:Rovibrational": 78.75362855419775, + "residue:FTmat-Transvibrational": 81.02749922723585, + "residue:FTmat-Rovibrational": 56.27644205458492, "united_atom:Conformational": 7.90098624365273, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 210.9386071250987 + "total": 224.98500840091168 } } } diff --git a/tests/regression/baselines/ethyl-acetate/combined_forcetorque_off.json b/tests/regression/baselines/ethyl-acetate/combined_forcetorque_off.json index 8c68cce7..31ef492c 100644 --- a/tests/regression/baselines/ethyl-acetate/combined_forcetorque_off.json +++ b/tests/regression/baselines/ethyl-acetate/combined_forcetorque_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 1.196367074472673, - "united_atom:Rovibrational": 82.36455154278131, - "residue:Transvibrational": 64.68750154134017, - "residue:Rovibrational": 58.903938937880085, + "united_atom:Transvibrational": 1.0945863942121685, + "united_atom:Rovibrational": 82.3645515427813, + "residue:Transvibrational": 68.30761200383697, + "residue:Rovibrational": 59.2965466793037, "united_atom:Conformational": 7.90098624365273, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 215.05334534012698 + "total": 218.96428286378688 } } } diff --git a/tests/regression/baselines/ethyl-acetate/frame_window.json b/tests/regression/baselines/ethyl-acetate/frame_window.json index be566d07..f89758d4 100644 --- a/tests/regression/baselines/ethyl-acetate/frame_window.json +++ b/tests/regression/baselines/ethyl-acetate/frame_window.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 28.312711247966337, - "united_atom:Rovibrational": 51.99036142818903, - "residue:FTmat-Transvibrational": 67.80560626717748, - "residue:FTmat-Rovibrational": 55.1631201009248, + "united_atom:Transvibrational": 29.40579085610341, + "united_atom:Rovibrational": 51.990361428188855, + "residue:FTmat-Transvibrational": 67.03974115661572, + "residue:FTmat-Rovibrational": 55.06851959311436, "united_atom:Conformational": 8.635471458692102, "residue:Conformational": 0.0, "residue:Orientational": 3.8984476469128193 }, - "total": 215.80571814986257 + "total": 216.03833213962727 } } } diff --git a/tests/regression/baselines/ethyl-acetate/grouping_each.json b/tests/regression/baselines/ethyl-acetate/grouping_each.json index e8330e08..6fa62cfb 100644 --- a/tests/regression/baselines/ethyl-acetate/grouping_each.json +++ b/tests/regression/baselines/ethyl-acetate/grouping_each.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.041680247513564334, - "residue:FTmat-Transvibrational": 13.339420001372439, + "united_atom:Rovibrational": 0.041680247513564424, + "residue:FTmat-Transvibrational": 13.339420001372433, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 13.381100248886003 + "total": 13.381100248885998 }, "1": { "components": { @@ -39,31 +39,31 @@ "3": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.08920089761061596, - "residue:FTmat-Transvibrational": 17.349320458476775, + "united_atom:Rovibrational": 0.08920089761061602, + "residue:FTmat-Transvibrational": 17.34932045847677, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 17.438521356087392 + "total": 17.43852135608739 }, "4": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.245873201826214, - "residue:FTmat-Transvibrational": 14.544753730547711, + "united_atom:Rovibrational": 0.2458732018262139, + "residue:FTmat-Transvibrational": 14.544753730547699, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 14.790626932373925 + "total": 14.790626932373913 }, "5": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.026788453489210204, + "united_atom:Rovibrational": 0.02678845348921013, "residue:FTmat-Transvibrational": 9.570910150584444, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, @@ -75,7 +75,7 @@ "6": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.052298040051129174, + "united_atom:Rovibrational": 0.05229804005112911, "residue:FTmat-Transvibrational": 12.801663361822174, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, @@ -87,38 +87,38 @@ "7": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.29162538377256375, - "residue:FTmat-Transvibrational": 16.40926078565228, + "united_atom:Rovibrational": 0.29162538377256336, + "residue:FTmat-Transvibrational": 16.40926078565227, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 16.70088616942484 + "total": 16.70088616942483 }, "8": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0469384299833255, - "residue:FTmat-Transvibrational": 10.172098915253201, + "residue:FTmat-Transvibrational": 10.172098915253212, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 10.219037345236528 + "total": 10.219037345236538 }, "9": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.2807736872545627, - "residue:FTmat-Transvibrational": 12.020836126353892, + "residue:FTmat-Transvibrational": 12.020836126353894, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 12.301609813608454 + "total": 12.301609813608456 } } } diff --git a/tests/regression/baselines/ethyl-acetate/selection_subset.json b/tests/regression/baselines/ethyl-acetate/selection_subset.json index 270dbbd5..e8befd41 100644 --- a/tests/regression/baselines/ethyl-acetate/selection_subset.json +++ b/tests/regression/baselines/ethyl-acetate/selection_subset.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 1.196367074472673, - "united_atom:Rovibrational": 82.36455154278131, - "residue:FTmat-Transvibrational": 74.5939232239247, - "residue:FTmat-Rovibrational": 55.42964192531005, + "united_atom:Transvibrational": 1.0945863942121685, + "united_atom:Rovibrational": 82.3645515427813, + "residue:FTmat-Transvibrational": 79.3546113986704, + "residue:FTmat-Rovibrational": 55.58023277682395, "united_atom:Conformational": 7.90098624365273, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 221.48547001014148 + "total": 226.29496835614057 } } } diff --git a/tests/regression/baselines/methane/axes_off.json b/tests/regression/baselines/methane/axes_off.json index dddf93d3..5eac4338 100644 --- a/tests/regression/baselines/methane/axes_off.json +++ b/tests/regression/baselines/methane/axes_off.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 42.51619525142699, - "united_atom:Rovibrational": 34.692556166968025, + "united_atom:Transvibrational": 42.71309458819117, + "united_atom:Rovibrational": 34.49645268839667, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 77.20875141839502 + "total": 77.20954727658784 } } } diff --git a/tests/regression/baselines/methane/combined_forcetorque_off.json b/tests/regression/baselines/methane/combined_forcetorque_off.json index 318c30c6..5b4ce51c 100644 --- a/tests/regression/baselines/methane/combined_forcetorque_off.json +++ b/tests/regression/baselines/methane/combined_forcetorque_off.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 42.51619525142699, - "united_atom:Rovibrational": 34.651932322640015, + "united_atom:Transvibrational": 42.71309458819117, + "united_atom:Rovibrational": 34.44108294190893, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 77.168127574067 + "total": 77.1541775301001 } } } diff --git a/tests/regression/baselines/methane/frame_window.json b/tests/regression/baselines/methane/frame_window.json index 9a45dc98..99458e41 100644 --- a/tests/regression/baselines/methane/frame_window.json +++ b/tests/regression/baselines/methane/frame_window.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 40.70376001258969, - "united_atom:Rovibrational": 33.778792396823484, + "united_atom:Transvibrational": 40.546757804157515, + "united_atom:Rovibrational": 33.43627689514928, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 74.48255240941317 + "total": 73.98303469930678 } } } diff --git a/tests/regression/baselines/methane/grouping_each.json b/tests/regression/baselines/methane/grouping_each.json index 3b31963b..949e9969 100644 --- a/tests/regression/baselines/methane/grouping_each.json +++ b/tests/regression/baselines/methane/grouping_each.json @@ -2,8 +2,8 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 24.315699188266926, - "united_atom:Rovibrational": 21.0483901242056, + "united_atom:Transvibrational": 24.315699188266905, + "united_atom:Rovibrational": 21.04839012420562, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, @@ -11,84 +11,84 @@ }, "1": { "components": { - "united_atom:Transvibrational": 23.76608267046309, - "united_atom:Rovibrational": 16.769636839671296, + "united_atom:Transvibrational": 23.766082670463117, + "united_atom:Rovibrational": 16.769636839671318, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 40.535719510134385 + "total": 40.535719510134435 }, "2": { "components": { - "united_atom:Transvibrational": 24.833896219788347, - "united_atom:Rovibrational": 16.996392060962357, + "united_atom:Transvibrational": 24.83389621978833, + "united_atom:Rovibrational": 16.996392060962343, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 41.83028828075071 + "total": 41.83028828075067 }, "3": { "components": { - "united_atom:Transvibrational": 6.6723857079283215, - "united_atom:Rovibrational": 4.986376282798274, + "united_atom:Transvibrational": 6.672385707928316, + "united_atom:Rovibrational": 4.986376282798272, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 11.658761990726596 + "total": 11.658761990726589 }, "4": { "components": { "united_atom:Transvibrational": 6.880461178899526, - "united_atom:Rovibrational": 4.441585994100298, + "united_atom:Rovibrational": 4.441585994100293, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 11.322047172999824 + "total": 11.322047172999818 }, "5": { "components": { - "united_atom:Transvibrational": 15.473092273577388, + "united_atom:Transvibrational": 15.473092273577436, "united_atom:Rovibrational": 7.777083478334702, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 23.25017575191209 + "total": 23.25017575191214 }, "6": { "components": { - "united_atom:Transvibrational": 25.694168010993888, - "united_atom:Rovibrational": 6.731392483940261, + "united_atom:Transvibrational": 25.694168010993906, + "united_atom:Rovibrational": 6.731392483940259, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 32.425560494934146 + "total": 32.42556049493417 }, "7": { "components": { - "united_atom:Transvibrational": 10.533257828925997, - "united_atom:Rovibrational": 8.97563913301586, + "united_atom:Transvibrational": 10.533257828925988, + "united_atom:Rovibrational": 8.975639133015862, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 19.508896961941858 + "total": 19.50889696194185 }, "8": { "components": { - "united_atom:Transvibrational": 7.332978272264879, - "united_atom:Rovibrational": 3.0418502362906086, + "united_atom:Transvibrational": 7.332978272264892, + "united_atom:Rovibrational": 3.0418502362906055, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 10.374828508555488 + "total": 10.374828508555497 }, "9": { "components": { "united_atom:Transvibrational": 4.023932761002867, - "united_atom:Rovibrational": 8.289324383636089, + "united_atom:Rovibrational": 8.289324383636096, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 12.313257144638957 + "total": 12.313257144638964 } } } diff --git a/tests/regression/baselines/methane/selection_subset.json b/tests/regression/baselines/methane/selection_subset.json index 318c30c6..5b4ce51c 100644 --- a/tests/regression/baselines/methane/selection_subset.json +++ b/tests/regression/baselines/methane/selection_subset.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 42.51619525142699, - "united_atom:Rovibrational": 34.651932322640015, + "united_atom:Transvibrational": 42.71309458819117, + "united_atom:Rovibrational": 34.44108294190893, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 77.168127574067 + "total": 77.1541775301001 } } } diff --git a/tests/regression/baselines/methanol/axes_off.json b/tests/regression/baselines/methanol/axes_off.json index d16ce042..518b54e5 100644 --- a/tests/regression/baselines/methanol/axes_off.json +++ b/tests/regression/baselines/methanol/axes_off.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 38.62138020563927, - "residue:FTmat-Transvibrational": 71.39139776743173, - "residue:FTmat-Rovibrational": 42.43745474015418, + "united_atom:Rovibrational": 40.470578424967975, + "residue:FTmat-Transvibrational": 81.39150587087775, + "residue:FTmat-Rovibrational": 39.65185616131401, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 152.45023271322518 + "total": 161.51394045715975 } } } diff --git a/tests/regression/baselines/methanol/combined_forcetorque_off.json b/tests/regression/baselines/methanol/combined_forcetorque_off.json index 634a9deb..84e6fb22 100644 --- a/tests/regression/baselines/methanol/combined_forcetorque_off.json +++ b/tests/regression/baselines/methanol/combined_forcetorque_off.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 49.59060714158691, - "residue:Transvibrational": 62.34591927524234, - "residue:Rovibrational": 32.010073141644966, + "united_atom:Rovibrational": 49.59060714158679, + "residue:Transvibrational": 63.011170818927425, + "residue:Rovibrational": 31.631180680507523, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 143.94659955847422 + "total": 144.23295864102172 } } } diff --git a/tests/regression/baselines/methanol/frame_window.json b/tests/regression/baselines/methanol/frame_window.json index 41bd2a34..079f0cc2 100644 --- a/tests/regression/baselines/methanol/frame_window.json +++ b/tests/regression/baselines/methanol/frame_window.json @@ -4,13 +4,13 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 34.6755419354061, - "residue:FTmat-Transvibrational": 61.225853411706915, - "residue:FTmat-Rovibrational": 29.74713345439499, + "residue:FTmat-Transvibrational": 63.22483760687048, + "residue:FTmat-Rovibrational": 29.43214053441657, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 125.64852880150801 + "total": 127.33252007669316 } } } diff --git a/tests/regression/baselines/methanol/grouping_each.json b/tests/regression/baselines/methanol/grouping_each.json index bba3b3c8..8d3a25e0 100644 --- a/tests/regression/baselines/methanol/grouping_each.json +++ b/tests/regression/baselines/methanol/grouping_each.json @@ -4,43 +4,43 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 3.6907058707318594, - "residue:FTmat-Transvibrational": 2.3780157804238655, + "residue:FTmat-Transvibrational": 2.37801578042395, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 6.068721651155725 + "total": 6.068721651155809 }, "1": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.527531744140127, - "residue:FTmat-Transvibrational": 6.542005999539831, + "residue:FTmat-Transvibrational": 6.54200599953984, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 7.069537743679958 + "total": 7.069537743679967 }, "2": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 1.6420992201948423, - "residue:FTmat-Transvibrational": 1.956061819377735, + "residue:FTmat-Transvibrational": 1.9560618193776211, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 3.5981610395725774 + "total": 3.5981610395724637 }, "3": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 1.09131345956036, - "residue:FTmat-Transvibrational": 0.00010873872941396156, + "residue:FTmat-Transvibrational": 0.00010873872941394453, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, @@ -52,73 +52,73 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 3.0175220560507166, - "residue:FTmat-Transvibrational": 0.039222512262787265, + "residue:FTmat-Transvibrational": 0.03922251226278259, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 3.056744568313504 + "total": 3.056744568313499 }, "5": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.7113434639378043, - "residue:FTmat-Transvibrational": 6.420669321384725, + "residue:FTmat-Transvibrational": 6.4206693213845005, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 7.132012785322529 + "total": 7.1320127853223045 }, "6": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 1.8814857352503516, - "residue:FTmat-Transvibrational": 0.0020168609040522737, + "united_atom:Rovibrational": 1.8814857352503533, + "residue:FTmat-Transvibrational": 0.002016860904052387, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 1.8835025961544039 + "total": 1.8835025961544056 }, "7": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.31891831875623067, - "residue:FTmat-Transvibrational": 0.22492845355007476, + "residue:FTmat-Transvibrational": 0.2249284535500741, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 0.5438467723063054 + "total": 0.5438467723063047 }, "8": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 1.3866864927610838, - "residue:FTmat-Transvibrational": 7.095998287788902, + "united_atom:Rovibrational": 1.3866864927610842, + "residue:FTmat-Transvibrational": 7.095998287789704, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 8.482684780549986 + "total": 8.482684780550787 }, "9": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.3408829290752051, - "residue:FTmat-Transvibrational": 0.0004316354724950617, + "residue:FTmat-Transvibrational": 0.0004316354724951205, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 0.3413145645477002 + "total": 0.34131456454770026 } } } diff --git a/tests/regression/baselines/methanol/selection_subset.json b/tests/regression/baselines/methanol/selection_subset.json index 293daec6..aa37195f 100644 --- a/tests/regression/baselines/methanol/selection_subset.json +++ b/tests/regression/baselines/methanol/selection_subset.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 49.59060714158691, - "residue:FTmat-Transvibrational": 74.80122215540344, - "residue:FTmat-Rovibrational": 27.55539097066781, + "united_atom:Rovibrational": 49.59060714158679, + "residue:FTmat-Transvibrational": 78.60873072810506, + "residue:FTmat-Rovibrational": 27.28134724177411, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 151.94722026765817 + "total": 155.48068511146596 } } } diff --git a/tests/regression/baselines/octonol/axes_off.json b/tests/regression/baselines/octonol/axes_off.json index bc391e6f..3ac5527d 100644 --- a/tests/regression/baselines/octonol/axes_off.json +++ b/tests/regression/baselines/octonol/axes_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.2907129992470817, - "united_atom:Rovibrational": 16.39249280495534, - "residue:FTmat-Transvibrational": 83.57043751308888, - "residue:FTmat-Rovibrational": 58.87291960143169, + "united_atom:Transvibrational": 0.3946170181442213, + "united_atom:Rovibrational": 15.964551734192693, + "residue:FTmat-Transvibrational": 88.89652899239388, + "residue:FTmat-Rovibrational": 59.284611948411424, "united_atom:Conformational": 16.83949354267619, "residue:Conformational": 0.0, "residue:Orientational": 25.79114991860739 }, - "total": 201.75720638000655 + "total": 207.17095315442577 } } } diff --git a/tests/regression/baselines/octonol/combined_forcetorque_off.json b/tests/regression/baselines/octonol/combined_forcetorque_off.json index 920589a7..94f8b1a9 100644 --- a/tests/regression/baselines/octonol/combined_forcetorque_off.json +++ b/tests/regression/baselines/octonol/combined_forcetorque_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.34382967782781193, - "united_atom:Rovibrational": 19.154228264604278, - "residue:Transvibrational": 74.72816183790984, - "residue:Rovibrational": 60.84390144550801, + "united_atom:Transvibrational": 0.35379238473384655, + "united_atom:Rovibrational": 19.154228264604267, + "residue:Transvibrational": 73.4888773906637, + "residue:Rovibrational": 61.888014555961526, "united_atom:Conformational": 16.83949354267619, "residue:Conformational": 0.0, "residue:Orientational": 25.79114991860739 }, - "total": 197.70076468713353 + "total": 197.5155560572469 } } } diff --git a/tests/regression/baselines/octonol/frame_window.json b/tests/regression/baselines/octonol/frame_window.json index 5c07dcc2..f36623a1 100644 --- a/tests/regression/baselines/octonol/frame_window.json +++ b/tests/regression/baselines/octonol/frame_window.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 65.86600728016141, - "united_atom:Rovibrational": 162.26463085986236, - "residue:FTmat-Transvibrational": 74.84326467422125, - "residue:FTmat-Rovibrational": 60.95710412746361, + "united_atom:Transvibrational": 70.87271844699075, + "united_atom:Rovibrational": 162.26463085986254, + "residue:FTmat-Transvibrational": 74.64608750357672, + "residue:FTmat-Rovibrational": 60.91083610153494, "united_atom:Conformational": 16.651144380045313, "residue:Conformational": 0.0, "residue:Orientational": 25.79114991860739 }, - "total": 406.37330124036134 + "total": 411.1365672106176 } } } diff --git a/tests/regression/baselines/octonol/grouping_each.json b/tests/regression/baselines/octonol/grouping_each.json index b4801742..dc2c9057 100644 --- a/tests/regression/baselines/octonol/grouping_each.json +++ b/tests/regression/baselines/octonol/grouping_each.json @@ -3,50 +3,50 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 6.942013165337579e-05, - "residue:FTmat-Transvibrational": 18.33494873681406, + "united_atom:Rovibrational": 6.942013165337589e-05, + "residue:FTmat-Transvibrational": 18.334948736814024, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 18.33501815694571 + "total": 18.335018156945676 }, "1": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00013794104464519378, - "residue:FTmat-Transvibrational": 14.571797812433102, + "residue:FTmat-Transvibrational": 14.571797812433093, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 45.863560270951176 }, - "total": 60.43549602442892 + "total": 60.435496024428915 }, "2": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.0007753303955700146, - "residue:FTmat-Transvibrational": 11.64466865126831, + "united_atom:Rovibrational": 0.000775330395570017, + "residue:FTmat-Transvibrational": 11.644668651268317, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 11.64544398166388 + "total": 11.645443981663886 }, "3": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.0031285818933102145, - "residue:FTmat-Transvibrational": 21.24135891910478, + "united_atom:Rovibrational": 0.0031285818933102097, + "residue:FTmat-Transvibrational": 21.241358919104748, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 21.24448750099809 + "total": 21.24448750099806 }, "4": { "components": { @@ -64,37 +64,37 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.005775850934008876, - "residue:FTmat-Transvibrational": 7.615636453348747, + "residue:FTmat-Transvibrational": 7.615636453348772, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 7.621412304282756 + "total": 7.621412304282781 }, "6": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00028812747686091, - "residue:FTmat-Transvibrational": 16.555914111511576, + "residue:FTmat-Transvibrational": 16.555914111511562, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 16.556202238988437 + "total": 16.556202238988423 }, "7": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0013568745282136598, - "residue:FTmat-Transvibrational": 15.71067757186967, + "residue:FTmat-Transvibrational": 15.710677571869644, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 15.712034446397883 + "total": 15.712034446397857 }, "8": { "components": { @@ -112,13 +112,13 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00015446787843376823, - "residue:FTmat-Transvibrational": 20.97761266375896, + "residue:FTmat-Transvibrational": 20.977612663758993, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 45.863560270951176 }, - "total": 66.84132740258858 + "total": 66.8413274025886 } } } diff --git a/tests/regression/baselines/octonol/selection_subset.json b/tests/regression/baselines/octonol/selection_subset.json index 5f9d18f1..b3c6cf87 100644 --- a/tests/regression/baselines/octonol/selection_subset.json +++ b/tests/regression/baselines/octonol/selection_subset.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.34382967782781193, - "united_atom:Rovibrational": 19.154228264604278, - "residue:FTmat-Transvibrational": 83.17889385114952, - "residue:FTmat-Rovibrational": 57.480841206687685, + "united_atom:Transvibrational": 0.35379238473384655, + "united_atom:Rovibrational": 19.154228264604267, + "residue:FTmat-Transvibrational": 85.63275438200148, + "residue:FTmat-Rovibrational": 57.14905396128441, "united_atom:Conformational": 16.83949354267619, "residue:Conformational": 0.0, "residue:Orientational": 25.79114991860739 }, - "total": 202.78843646155286 + "total": 204.92047245390756 } } } diff --git a/tests/regression/baselines/water/axes_off.json b/tests/regression/baselines/water/axes_off.json index 9b798bdc..855b3e0b 100644 --- a/tests/regression/baselines/water/axes_off.json +++ b/tests/regression/baselines/water/axes_off.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 51.22145722965398, - "united_atom:Rovibrational": 17.307840626636324, + "united_atom:Transvibrational": 50.29463976726311, + "united_atom:Rovibrational": 17.75547865377748, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 68.5292978562903 + "total": 68.0501184210406 } } } diff --git a/tests/regression/baselines/water/combined_forcetorque_off.json b/tests/regression/baselines/water/combined_forcetorque_off.json index 2e632568..e3ff82df 100644 --- a/tests/regression/baselines/water/combined_forcetorque_off.json +++ b/tests/regression/baselines/water/combined_forcetorque_off.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 51.22145722965398, - "united_atom:Rovibrational": 17.232634718413053, + "united_atom:Transvibrational": 50.29463976726311, + "united_atom:Rovibrational": 17.795473940796423, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 68.45409194806703 + "total": 68.09011370805953 } } } diff --git a/tests/regression/baselines/water/frame_window.json b/tests/regression/baselines/water/frame_window.json index c6ae550d..07b9d672 100644 --- a/tests/regression/baselines/water/frame_window.json +++ b/tests/regression/baselines/water/frame_window.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 46.684099714230925, - "united_atom:Rovibrational": 17.694014405444744, + "united_atom:Transvibrational": 46.294728006800256, + "united_atom:Rovibrational": 17.298848645671537, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 64.37811411967567 + "total": 63.593576652471796 } } } diff --git a/tests/regression/baselines/water/grouping_each.json b/tests/regression/baselines/water/grouping_each.json index acccd86b..f14a07e9 100644 --- a/tests/regression/baselines/water/grouping_each.json +++ b/tests/regression/baselines/water/grouping_each.json @@ -2,44 +2,44 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 14.945907953805552, - "united_atom:Rovibrational": 1.8947243953648254, + "united_atom:Transvibrational": 14.945907953805547, + "united_atom:Rovibrational": 1.894724395364822, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 16.840632349170377 + "total": 16.84063234917037 }, "1": { "components": { - "united_atom:Transvibrational": 8.111522208287779, - "united_atom:Rovibrational": 0.9607747968334215, + "united_atom:Transvibrational": 8.111522208287775, + "united_atom:Rovibrational": 0.9607747968334228, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 9.0722970051212 + "total": 9.072297005121198 }, "2": { "components": { - "united_atom:Transvibrational": 15.79497347968759, - "united_atom:Rovibrational": 4.606072530590255, + "united_atom:Transvibrational": 15.794973479687595, + "united_atom:Rovibrational": 4.606072530590256, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 20.401046010277845 + "total": 20.401046010277852 }, "3": { "components": { - "united_atom:Transvibrational": 9.462487265119448, + "united_atom:Transvibrational": 9.462487265119444, "united_atom:Rovibrational": 1.6509513986984767, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 11.113438663817924 + "total": 11.11343866381792 }, "4": { "components": { "united_atom:Transvibrational": 16.254161245740693, - "united_atom:Rovibrational": 1.367597374110767, + "united_atom:Rovibrational": 1.3675973741107645, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, @@ -47,34 +47,34 @@ }, "5": { "components": { - "united_atom:Transvibrational": 11.57779876203329, - "united_atom:Rovibrational": 7.351163568004953, + "united_atom:Transvibrational": 11.577798762033282, + "united_atom:Rovibrational": 7.3511635680049485, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 18.928962330038242 + "total": 18.92896233003823 }, "6": { "components": { - "united_atom:Transvibrational": 10.172061262201801, - "united_atom:Rovibrational": 3.671537296888502, + "united_atom:Transvibrational": 10.172061262201797, + "united_atom:Rovibrational": 3.6715372968885003, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 13.843598559090303 + "total": 13.843598559090298 }, "7": { "components": { - "united_atom:Transvibrational": 13.49951045186194, + "united_atom:Transvibrational": 13.499510451861937, "united_atom:Rovibrational": 1.7029491215274863, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 15.202459573389428 + "total": 15.202459573389424 }, "8": { "components": { - "united_atom:Transvibrational": 16.597759171924583, + "united_atom:Transvibrational": 16.59775917192458, "united_atom:Rovibrational": 1.6190289365617598, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 @@ -83,12 +83,12 @@ }, "9": { "components": { - "united_atom:Transvibrational": 13.731375187064538, + "united_atom:Transvibrational": 13.731375187064533, "united_atom:Rovibrational": 5.650620990305761, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 19.381996177370297 + "total": 19.381996177370294 } } } diff --git a/tests/regression/baselines/water/selection_subset.json b/tests/regression/baselines/water/selection_subset.json index 2e632568..e3ff82df 100644 --- a/tests/regression/baselines/water/selection_subset.json +++ b/tests/regression/baselines/water/selection_subset.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 51.22145722965398, - "united_atom:Rovibrational": 17.232634718413053, + "united_atom:Transvibrational": 50.29463976726311, + "united_atom:Rovibrational": 17.795473940796423, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 68.45409194806703 + "total": 68.09011370805953 } } } diff --git a/tests/regression/baselines/water/water_off.json b/tests/regression/baselines/water/water_off.json index 2e632568..e3ff82df 100644 --- a/tests/regression/baselines/water/water_off.json +++ b/tests/regression/baselines/water/water_off.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 51.22145722965398, - "united_atom:Rovibrational": 17.232634718413053, + "united_atom:Transvibrational": 50.29463976726311, + "united_atom:Rovibrational": 17.795473940796423, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 68.45409194806703 + "total": 68.09011370805953 } } } From 88a4e677a56fb8d9d72411fbafa2b3c6b2eebe45 Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Wed, 7 Oct 2026 17:26:35 +0100 Subject: [PATCH 05/12] fix(axes): take the moment of inertia tensor after making the molecule whole --- CodeEntropy/levels/axes.py | 7 +++++-- tests/unit/CodeEntropy/levels/test_axes.py | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/CodeEntropy/levels/axes.py b/CodeEntropy/levels/axes.py index 9ea542f4..df2dea56 100644 --- a/CodeEntropy/levels/axes.py +++ b/CodeEntropy/levels/axes.py @@ -819,7 +819,10 @@ def get_vanilla_axes(self, molecule): moment of inertia tensor. The original description is preserved: - - The molecule is made whole to ensure correct handling of PBC. + + - The molecule is made whole to ensure correct handling of PBC. The tensor + is taken after that, so it does not depend on where the molecule sits + relative to the periodic boundary. - The moments are obtained by diagonalising the moment of inertia tensor. - Eigenvalues are returned sorted from largest to smallest magnitude. @@ -832,8 +835,8 @@ def get_vanilla_axes(self, molecule): - principal_axes: (3, 3) axes. - moment_of_inertia: (3,) moments sorted descending by absolute value. """ - moment_of_inertia_tensor = molecule.moment_of_inertia(unwrap=True) make_whole(molecule.atoms) + moment_of_inertia_tensor = molecule.moment_of_inertia() principal_axes = self.get_principal_axes(molecule) eigenvalues, _ = np.linalg.eigh(moment_of_inertia_tensor) diff --git a/tests/unit/CodeEntropy/levels/test_axes.py b/tests/unit/CodeEntropy/levels/test_axes.py index 8c5c58be..4831b5d8 100644 --- a/tests/unit/CodeEntropy/levels/test_axes.py +++ b/tests/unit/CodeEntropy/levels/test_axes.py @@ -1,5 +1,6 @@ from unittest.mock import MagicMock +import MDAnalysis as mda import numpy as np import pytest @@ -392,6 +393,26 @@ def test_get_principal_axes_passes_wrap_to_moment_of_inertia(): group.atoms.moment_of_inertia.assert_called_once_with(wrap=True) +def test_get_vanilla_axes_moments_ignore_position_relative_to_box(): + """Shifting a molecule by a box vector must not change its moments.""" + universe = mda.Universe.empty( + n_atoms=3, n_residues=1, atom_resindex=[0, 0, 0], trajectory=True + ) + universe.add_TopologyAttr("masses", [16.0, 1.0, 1.0]) + universe.add_TopologyAttr("bonds", [(0, 1), (0, 2)]) + universe.dimensions = [50.0, 50.0, 50.0, 90.0, 90.0, 90.0] + positions = np.array([[0.0, 0.0, 0.0], [0.96, 0.0, 0.0], [-0.24, 0.93, 0.0]]) + ax = AxesCalculator() + + universe.atoms.positions = positions + 25.0 + _, moments = ax.get_vanilla_axes(universe.atoms) + universe.atoms.positions = positions + 25.0 + np.array([50.0, 0.0, 0.0]) + _, shifted_moments = ax.get_vanilla_axes(universe.atoms) + + assert np.allclose(shifted_moments, moments, rtol=1e-3) + assert moments.max() < 10.0 + + def test_find_bonded_atoms_selects_heavy_and_hydrogen_groups(): ax = AxesCalculator() From 601456465f88483bceb3a56bdf5e116ead5f7366 Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Wed, 7 Oct 2026 17:27:27 +0100 Subject: [PATCH 06/12] tests(regression): update baselines for corrected moments of inertia --- tests/regression/baselines/benzaldehyde/axes_off.json | 4 ++-- tests/regression/baselines/benzene/axes_off.json | 4 ++-- tests/regression/baselines/cyclohexane/axes_off.json | 4 ++-- tests/regression/baselines/ethyl-acetate/axes_off.json | 4 ++-- tests/regression/baselines/methanol/axes_off.json | 8 ++++---- tests/regression/baselines/octonol/axes_off.json | 4 ++-- tests/regression/baselines/water/frame_window.json | 4 ++-- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/regression/baselines/benzaldehyde/axes_off.json b/tests/regression/baselines/benzaldehyde/axes_off.json index 0d34d6c5..88b1d4ea 100644 --- a/tests/regression/baselines/benzaldehyde/axes_off.json +++ b/tests/regression/baselines/benzaldehyde/axes_off.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.059408867580823616, - "united_atom:Rovibrational": 39.36932344859785, + "united_atom:Rovibrational": 42.74113469783653, "residue:FTmat-Transvibrational": 81.48352353795262, "residue:FTmat-Rovibrational": 63.04898043265405, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 20.481571492615355 }, - "total": 204.44280777940068 + "total": 207.81461902863938 } } } diff --git a/tests/regression/baselines/benzene/axes_off.json b/tests/regression/baselines/benzene/axes_off.json index 109194ee..65fd74d9 100644 --- a/tests/regression/baselines/benzene/axes_off.json +++ b/tests/regression/baselines/benzene/axes_off.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.16163858692459776, - "united_atom:Rovibrational": 44.48477691495675, + "united_atom:Rovibrational": 41.334360466552276, "residue:FTmat-Transvibrational": 81.11811255841327, "residue:FTmat-Rovibrational": 47.03606119622739, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 172.80058925652202 + "total": 169.65017280811753 } } } diff --git a/tests/regression/baselines/cyclohexane/axes_off.json b/tests/regression/baselines/cyclohexane/axes_off.json index 2d6038ac..b132d553 100644 --- a/tests/regression/baselines/cyclohexane/axes_off.json +++ b/tests/regression/baselines/cyclohexane/axes_off.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.8231608488813442, - "united_atom:Rovibrational": 24.640396903026634, + "united_atom:Rovibrational": 24.764245274692822, "residue:FTmat-Transvibrational": 84.05755363684698, "residue:FTmat-Rovibrational": 61.73316378799838, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 171.2542751767533 + "total": 171.37812354841952 } } } diff --git a/tests/regression/baselines/ethyl-acetate/axes_off.json b/tests/regression/baselines/ethyl-acetate/axes_off.json index b501e824..a33ca378 100644 --- a/tests/regression/baselines/ethyl-acetate/axes_off.json +++ b/tests/regression/baselines/ethyl-acetate/axes_off.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 1.0264523212404142, - "united_atom:Rovibrational": 78.75362855419775, + "united_atom:Rovibrational": 78.59041516704335, "residue:FTmat-Transvibrational": 81.02749922723585, "residue:FTmat-Rovibrational": 56.27644205458492, "united_atom:Conformational": 7.90098624365273, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 224.98500840091168 + "total": 224.82179501375725 } } } diff --git a/tests/regression/baselines/methanol/axes_off.json b/tests/regression/baselines/methanol/axes_off.json index 518b54e5..20724634 100644 --- a/tests/regression/baselines/methanol/axes_off.json +++ b/tests/regression/baselines/methanol/axes_off.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 40.470578424967975, - "residue:FTmat-Transvibrational": 81.39150587087775, - "residue:FTmat-Rovibrational": 39.65185616131401, + "united_atom:Rovibrational": 40.225584031848285, + "residue:FTmat-Transvibrational": 80.99617693970961, + "residue:FTmat-Rovibrational": 39.57294744515248, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 161.51394045715975 + "total": 160.79470841671036 } } } diff --git a/tests/regression/baselines/octonol/axes_off.json b/tests/regression/baselines/octonol/axes_off.json index 3ac5527d..dccb7c6f 100644 --- a/tests/regression/baselines/octonol/axes_off.json +++ b/tests/regression/baselines/octonol/axes_off.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.3946170181442213, - "united_atom:Rovibrational": 15.964551734192693, + "united_atom:Rovibrational": 13.42009963284138, "residue:FTmat-Transvibrational": 88.89652899239388, "residue:FTmat-Rovibrational": 59.284611948411424, "united_atom:Conformational": 16.83949354267619, "residue:Conformational": 0.0, "residue:Orientational": 25.79114991860739 }, - "total": 207.17095315442577 + "total": 204.6265010530745 } } } diff --git a/tests/regression/baselines/water/frame_window.json b/tests/regression/baselines/water/frame_window.json index 07b9d672..3260da14 100644 --- a/tests/regression/baselines/water/frame_window.json +++ b/tests/regression/baselines/water/frame_window.json @@ -3,11 +3,11 @@ "0": { "components": { "united_atom:Transvibrational": 46.294728006800256, - "united_atom:Rovibrational": 17.298848645671537, + "united_atom:Rovibrational": 17.257985709030912, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 63.593576652471796 + "total": 63.55271371583117 } } } From 9525c8802bbb15bfce63454c5c485bd0a3f469aa Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Wed, 7 Oct 2026 17:48:36 +0100 Subject: [PATCH 07/12] fix(axes): make principal axes reproducible across LAPACK builds --- CodeEntropy/levels/axes.py | 110 ++++++++++++--------- tests/unit/CodeEntropy/levels/test_axes.py | 102 ++++++++++++++++--- 2 files changed, 154 insertions(+), 58 deletions(-) diff --git a/CodeEntropy/levels/axes.py b/CodeEntropy/levels/axes.py index df2dea56..cf5531c8 100644 --- a/CodeEntropy/levels/axes.py +++ b/CodeEntropy/levels/axes.py @@ -837,13 +837,7 @@ def get_vanilla_axes(self, molecule): """ make_whole(molecule.atoms) moment_of_inertia_tensor = molecule.moment_of_inertia() - principal_axes = self.get_principal_axes(molecule) - - eigenvalues, _ = np.linalg.eigh(moment_of_inertia_tensor) - order = np.argsort(np.abs(eigenvalues))[::-1] - moment_of_inertia = eigenvalues[order] - - return principal_axes, moment_of_inertia + return self.get_reproducible_axes(moment_of_inertia_tensor) def get_custom_axes( self, @@ -1082,17 +1076,10 @@ def get_custom_principal_axes( ) -> tuple[np.ndarray, np.ndarray]: """Compute principal axes and moments from a custom MOI tensor. - Principal axes and centre of axes from the ordered eigenvalues and - eigenvectors of a moment of inertia tensor. This function allows for a - custom moment of inertia tensor to be used, which isn't possible with the - built-in MDAnalysis principal_axes() function. - - Original behaviour preserved: - - - Eigenvalues are sorted by descending absolute magnitude. - - Eigenvectors are transposed so axes are returned as rows. - - Z axis is flipped to enforce the same handedness convention as the - original implementation. + Principal axes and moments from the ordered eigenvalues and eigenvectors of + a moment of inertia tensor. This function allows for a custom moment of + inertia tensor to be used. The axes are made reproducible by + :meth:`get_reproducible_axes`. Args: moment_of_inertia_tensor: (3, 3) custom inertia tensor. @@ -1100,49 +1087,80 @@ def get_custom_principal_axes( Returns: Tuple[np.ndarray, np.ndarray]: - principal_axes: (3, 3) principal axes (rows). - - moment_of_inertia: (3,) principal moments. + - moment_of_inertia: (3,) principal moments sorted descending by + absolute value. """ - eigenvalues, eigenvectors = np.linalg.eigh(moment_of_inertia_tensor) - order = np.abs(eigenvalues).argsort()[::-1] # descending order - transposed = np.transpose(eigenvectors) # columns -> rows - moment_of_inertia = eigenvalues[order] - principal_axes = transposed[order] - - # point z axis in correct direction, as per original code - cross_xy = np.cross(principal_axes[0], principal_axes[1]) - dot_z = float(np.dot(cross_xy, principal_axes[2])) - if dot_z < 0: - principal_axes[2] *= -1 - - return principal_axes, moment_of_inertia + return self.get_reproducible_axes(moment_of_inertia_tensor) def get_principal_axes(self, group, wrap: bool = False) -> np.ndarray: """Compute the principal axes of an atom group from its moment of inertia. - Uses ``np.linalg.eigh`` rather than ``np.linalg.eig``. The moment of inertia - tensor is symmetric, so ``eigh`` returns orthonormal axes, whereas ``eig`` - can return skewed axes for (near-)degenerate moments. - - - Axes are sorted by descending (signed) eigenvalue and returned as rows. - - If the axes are left-handed, all three are flipped. - Args: group: Atom group (or anything with ``.atoms``). wrap: Whether to wrap atoms into the primary unit cell before computing the moment of inertia. Returns: - np.ndarray: (3, 3) principal axes (rows). + np.ndarray: (3, 3) principal axes (rows), as given by + :meth:`get_reproducible_axes`. """ - atomgroup = group.atoms - e_val, e_vec = np.linalg.eigh(atomgroup.moment_of_inertia(wrap=wrap)) + tensor = group.atoms.moment_of_inertia(wrap=wrap) + principal_axes, _ = self.get_reproducible_axes(tensor) + return principal_axes - e_vec = e_vec[:, np.argsort(e_val)[::-1]].T + def get_reproducible_axes( + self, tensor: np.ndarray, rtol: float = 1e-5 + ) -> tuple[np.ndarray, np.ndarray]: + """Diagonalise a symmetric tensor into reproducible principal axes. + + ``np.linalg.eigh`` returns orthonormal axes, but the sign of each axis, and + the choice of axes within a set of (near-)equal moments, can differ between + LAPACK builds. These axes are used to average covariances over molecules and + frames, so that choice changes the entropy. This method fixes it: + + - Moments are sorted descending by absolute value. + - Axes whose moments are equal to within ``rtol`` (relative to the largest + moment) are re-chosen from the eigenvectors of a fixed reference tensor + projected onto the shared subspace. Axes with distinct moments are left as + they are. + - The first two axes are signed to point along the lab-frame direction + (1, 2, 3), and the third is their cross product, so the axes are + right-handed. - if np.dot(np.cross(e_vec[0], e_vec[1]), e_vec[2]) < 0: - e_vec *= -1 + The result is reproducible but is a function of the lab-frame orientation, + so it is not rotation covariant. + + Args: + tensor: (3, 3) symmetric tensor, e.g. a moment of inertia tensor. + rtol: Relative tolerance for treating two moments as equal. - return e_vec + Returns: + Tuple[np.ndarray, np.ndarray]: + - principal_axes: (3, 3) principal axes (rows). + - moments: (3,) principal moments sorted descending by absolute + value. + """ + moments, vectors = np.linalg.eigh(tensor) + order = np.argsort(np.abs(moments))[::-1] + moments, vectors = moments[order], vectors[:, order] + + reference_direction = np.array([1.0, 2.0, 3.0]) + gaps = np.abs(np.diff(np.abs(moments))) + group_starts = np.flatnonzero(gaps > rtol * np.abs(moments[0])) + 1 + for group in np.split(np.arange(3), group_starts): + if len(group) > 1: + shared = vectors[:, group] + reference = shared.T @ np.diag(reference_direction) @ shared + _, rotation = np.linalg.eigh(reference) + vectors[:, group] = shared @ rotation + + for i in (0, 1): + if vectors[:, i] @ reference_direction < 0: + vectors[:, i] *= -1 + + third_axis = np.cross(vectors[:, 0], vectors[:, 1]) + principal_axes = np.array([vectors[:, 0], vectors[:, 1], third_axis]) + return principal_axes, moments def get_UA_masses(self, molecule) -> list[float]: """Return united-atom (UA) masses for a molecule. diff --git a/tests/unit/CodeEntropy/levels/test_axes.py b/tests/unit/CodeEntropy/levels/test_axes.py index 4831b5d8..594b5c67 100644 --- a/tests/unit/CodeEntropy/levels/test_axes.py +++ b/tests/unit/CodeEntropy/levels/test_axes.py @@ -293,7 +293,7 @@ def test_get_flipped_axes_flips_negative_dot(): assert np.allclose(flipped[0], np.array([1.0, 0.0, 0.0])) -def test_get_custom_principal_axes_flips_z_when_left_handed(): +def test_get_custom_principal_axes_returns_axes_and_moments(): ax = AxesCalculator() moi = np.eye(3) axes, vals = ax.get_custom_principal_axes(moi) @@ -368,19 +368,97 @@ def test_get_principal_axes_orthonormal_and_right_handed_for_near_degenerate(): assert np.isclose(abs(np.dot(axes[0], q[:, 2])), 1.0) -def test_get_principal_axes_flips_all_axes_when_left_handed(monkeypatch): +def _scrambled_eigh(seed): + """Return an ``eigh`` that gives valid but arbitrary signs and degenerate bases.""" + rng = np.random.default_rng(seed) + real_eigh = np.linalg.eigh + + def scrambled(matrix): + values, vectors = real_eigh(matrix) + n = len(values) + for i in range(n): + for j in range(i + 1, n): + if np.isclose(values[i], values[j], rtol=1e-5): + angle = rng.uniform(0, 2 * np.pi) + c, s = np.cos(angle), np.sin(angle) + vi, vj = vectors[:, i].copy(), vectors[:, j].copy() + vectors[:, i] = c * vi + s * vj + vectors[:, j] = -s * vi + c * vj + return values, vectors * rng.choice([-1.0, 1.0], size=n) + + return scrambled + + +def _example_tensors(): + rng = np.random.default_rng(1) + q, _ = np.linalg.qr(rng.normal(size=(3, 3))) + return { + "asymmetric_top": q @ np.diag([5.0, 3.0, 1.0]) @ q.T, + "linear": q @ np.diag([4.0, 4.0, 0.0]) @ q.T, + "symmetric_top": q @ np.diag([5.0, 2.0, 2.0]) @ q.T, + "spherical_top": 3.0 * np.eye(3), + } + + +@pytest.mark.parametrize("name", list(_example_tensors())) +def test_get_reproducible_axes_orthonormal_right_handed_and_diagonalising(name): ax = AxesCalculator() - group = MagicMock() - group.atoms.moment_of_inertia.return_value = np.eye(3) - monkeypatch.setattr( - np.linalg, "eigh", lambda _m: (np.array([1.0, 2.0, 3.0]), np.eye(3)) - ) + tensor = _example_tensors()[name] - axes = ax.get_principal_axes(group) + axes, moments = ax.get_reproducible_axes(tensor) + + assert np.allclose(axes @ axes.T, np.eye(3), atol=1e-12) + assert np.isclose(np.linalg.det(axes), 1.0) + assert np.allclose(axes @ tensor @ axes.T, np.diag(moments), atol=1e-12) + assert np.all(np.diff(np.abs(moments)) <= 1e-12) + + +@pytest.mark.parametrize("name", list(_example_tensors())) +def test_get_reproducible_axes_independent_of_eigensolver_choices(monkeypatch, name): + ax = AxesCalculator() + tensor = _example_tensors()[name] + expected_axes, expected_moments = ax.get_reproducible_axes(tensor) + + for seed in range(20): + monkeypatch.setattr(np.linalg, "eigh", _scrambled_eigh(seed)) + axes, moments = ax.get_reproducible_axes(tensor) + assert np.allclose(axes, expected_axes, atol=1e-9) + assert np.allclose(moments, expected_moments) + + +@pytest.mark.parametrize("name", list(_example_tensors())) +def test_get_reproducible_axes_stable_under_rounding_level_noise(name): + ax = AxesCalculator() + tensor = _example_tensors()[name] + expected_axes, _ = ax.get_reproducible_axes(tensor) + rng = np.random.default_rng(2) + + for _ in range(50): + noise = rng.normal(scale=1e-7, size=(3, 3)) + axes, _ = ax.get_reproducible_axes(tensor + (noise + noise.T) / 2) + assert np.allclose(axes, expected_axes, atol=1e-4) + + +def test_get_reproducible_axes_keeps_unique_axis_of_linear_tensor_exact(): + ax = AxesCalculator() + direction = np.array([1.0, -2.0, 0.5]) + direction /= np.linalg.norm(direction) + tensor = 4.0 * (np.eye(3) - np.outer(direction, direction)) + + axes, moments = ax.get_reproducible_axes(tensor) + + assert np.isclose(moments[2], 0.0, atol=1e-12) + assert np.isclose(abs(axes[2] @ direction), 1.0, atol=1e-12) + + +def test_get_reproducible_axes_signs_first_two_axes_along_reference_direction(): + ax = AxesCalculator() + tensor = np.diag([5.0, 3.0, 1.0]) + + axes, _ = ax.get_reproducible_axes(tensor) - # descending order gives rows e3, e2, e1 (left-handed), so all are negated - expected = -np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]], dtype=float) - assert np.allclose(axes, expected) + assert axes[0] @ np.array([1.0, 2.0, 3.0]) > 0 + assert axes[1] @ np.array([1.0, 2.0, 3.0]) > 0 def test_get_principal_axes_passes_wrap_to_moment_of_inertia(): @@ -653,7 +731,7 @@ def test_get_custom_axes_raises_when_normalization_degenerate(): ac.get_custom_axes(a=a, b_list=b_list, c=c, dimensions=dims) -def test_get_custom_principal_axes_flips_z_for_handedness(): +def test_get_custom_principal_axes_is_right_handed(): ac = AxesCalculator() moi = np.diag([3.0, 2.0, 1.0]) From 42587deef4039964535893a3b087445a8b591ea0 Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Wed, 7 Oct 2026 17:58:37 +0100 Subject: [PATCH 08/12] tests(regression): update baselines for reproducible principal axes --- .../baselines/benzaldehyde/axes_off.json | 10 ++--- .../combined_forcetorque_false.json | 8 ++-- .../baselines/benzaldehyde/frame_window.json | 8 ++-- .../baselines/benzaldehyde/grouping_each.json | 16 ++++---- .../benzaldehyde/selection_subset.json | 8 ++-- .../baselines/benzene/axes_off.json | 10 ++--- .../benzene/combined_forcetorque_off.json | 8 ++-- .../baselines/benzene/frame_window.json | 8 ++-- .../baselines/benzene/grouping_each.json | 36 +++++++++--------- .../baselines/benzene/selection_subset.json | 8 ++-- .../baselines/cyclohexane/axes_off.json | 10 ++--- .../cyclohexane/combined_forcetorque_off.json | 8 ++-- .../baselines/cyclohexane/frame_window.json | 8 ++-- .../baselines/cyclohexane/grouping_each.json | 24 ++++++------ .../cyclohexane/selection_subset.json | 8 ++-- tests/regression/baselines/dna/axes_off.json | 16 ++++---- .../dna/combined_forcetorque_off.json | 14 +++---- .../baselines/dna/frame_window.json | 12 +++--- .../baselines/dna/grouping_each.json | 8 ++-- .../baselines/dna/selection_subset.json | 8 ++-- .../baselines/ethyl-acetate/axes_off.json | 10 ++--- .../combined_forcetorque_off.json | 8 ++-- .../baselines/ethyl-acetate/frame_window.json | 8 ++-- .../ethyl-acetate/grouping_each.json | 28 +++++++------- .../ethyl-acetate/selection_subset.json | 8 ++-- .../baselines/methane/axes_off.json | 6 +-- .../methane/combined_forcetorque_off.json | 6 +-- .../baselines/methane/frame_window.json | 6 +-- .../baselines/methane/grouping_each.json | 38 +++++++++---------- .../baselines/methane/selection_subset.json | 6 +-- .../baselines/methanol/axes_off.json | 8 ++-- .../methanol/combined_forcetorque_off.json | 6 +-- .../baselines/methanol/frame_window.json | 6 +-- .../baselines/methanol/grouping_each.json | 4 +- .../baselines/methanol/selection_subset.json | 6 +-- .../baselines/octonol/axes_off.json | 10 ++--- .../octonol/combined_forcetorque_off.json | 8 ++-- .../baselines/octonol/frame_window.json | 8 ++-- .../baselines/octonol/grouping_each.json | 16 ++++---- .../baselines/octonol/selection_subset.json | 8 ++-- .../regression/baselines/water/axes_off.json | 6 +-- .../water/combined_forcetorque_off.json | 6 +-- .../baselines/water/frame_window.json | 6 +-- .../baselines/water/grouping_each.json | 26 ++++++------- .../baselines/water/selection_subset.json | 6 +-- .../regression/baselines/water/water_off.json | 6 +-- 46 files changed, 248 insertions(+), 248 deletions(-) diff --git a/tests/regression/baselines/benzaldehyde/axes_off.json b/tests/regression/baselines/benzaldehyde/axes_off.json index 88b1d4ea..3553c765 100644 --- a/tests/regression/baselines/benzaldehyde/axes_off.json +++ b/tests/regression/baselines/benzaldehyde/axes_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.059408867580823616, - "united_atom:Rovibrational": 42.74113469783653, - "residue:FTmat-Transvibrational": 81.48352353795262, - "residue:FTmat-Rovibrational": 63.04898043265405, + "united_atom:Transvibrational": 0.06950663196232491, + "united_atom:Rovibrational": 35.19655714759131, + "residue:FTmat-Transvibrational": 86.6413638447789, + "residue:FTmat-Rovibrational": 62.24303760058523, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 20.481571492615355 }, - "total": 207.81461902863938 + "total": 204.6320367175331 } } } diff --git a/tests/regression/baselines/benzaldehyde/combined_forcetorque_false.json b/tests/regression/baselines/benzaldehyde/combined_forcetorque_false.json index 66c2f7ce..638aefd6 100644 --- a/tests/regression/baselines/benzaldehyde/combined_forcetorque_false.json +++ b/tests/regression/baselines/benzaldehyde/combined_forcetorque_false.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.05129761410051273, + "united_atom:Transvibrational": 0.06817494136874551, "united_atom:Rovibrational": 49.686697381523466, - "residue:Transvibrational": 69.21750344995603, - "residue:Rovibrational": 67.99888878209293, + "residue:Transvibrational": 69.25273989458984, + "residue:Rovibrational": 68.64810133422232, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 20.481571492615355 }, - "total": 207.4359587202883 + "total": 208.13728504431973 } } } diff --git a/tests/regression/baselines/benzaldehyde/frame_window.json b/tests/regression/baselines/benzaldehyde/frame_window.json index 9f7e948e..4f8f6367 100644 --- a/tests/regression/baselines/benzaldehyde/frame_window.json +++ b/tests/regression/baselines/benzaldehyde/frame_window.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 42.23402688550062, + "united_atom:Transvibrational": 37.90368186636453, "united_atom:Rovibrational": 38.219068584436165, - "residue:FTmat-Transvibrational": 73.4310301096772, - "residue:FTmat-Rovibrational": 57.470843728209715, + "residue:FTmat-Transvibrational": 73.76730786578052, + "residue:FTmat-Rovibrational": 57.689489298548764, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 20.481571492615355 }, - "total": 231.83654080043905 + "total": 228.06111910774533 } } } diff --git a/tests/regression/baselines/benzaldehyde/grouping_each.json b/tests/regression/baselines/benzaldehyde/grouping_each.json index 50a38c1e..f9aa4551 100644 --- a/tests/regression/baselines/benzaldehyde/grouping_each.json +++ b/tests/regression/baselines/benzaldehyde/grouping_each.json @@ -4,7 +4,7 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.062499436482478535, - "residue:FTmat-Transvibrational": 16.83857036769833, + "residue:FTmat-Transvibrational": 16.838570367698324, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, @@ -52,19 +52,19 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.003874883925216773, - "residue:FTmat-Transvibrational": 23.899916844406135, + "residue:FTmat-Transvibrational": 23.899916844406114, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 23.903791728331353 + "total": 23.90379172833133 }, "5": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.010824819910336868, - "residue:FTmat-Transvibrational": 11.054797795596109, + "residue:FTmat-Transvibrational": 11.054797795596103, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, @@ -76,25 +76,25 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00018982532508837537, - "residue:FTmat-Transvibrational": 19.72392512749092, + "residue:FTmat-Transvibrational": 19.723925127490933, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 19.724114952816006 + "total": 19.72411495281602 }, "7": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.004033941970593011, - "residue:FTmat-Transvibrational": 18.906768821421363, + "residue:FTmat-Transvibrational": 18.906768821421366, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 18.910802763391956 + "total": 18.91080276339196 }, "8": { "components": { diff --git a/tests/regression/baselines/benzaldehyde/selection_subset.json b/tests/regression/baselines/benzaldehyde/selection_subset.json index 5b95eece..65e53088 100644 --- a/tests/regression/baselines/benzaldehyde/selection_subset.json +++ b/tests/regression/baselines/benzaldehyde/selection_subset.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.05129761410051273, + "united_atom:Transvibrational": 0.06817494136874551, "united_atom:Rovibrational": 49.686697381523466, - "residue:FTmat-Transvibrational": 82.05934573652353, - "residue:FTmat-Rovibrational": 61.71704168262333, + "residue:FTmat-Transvibrational": 85.94814793508023, + "residue:FTmat-Rovibrational": 61.7256510401677, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 20.481571492615355 }, - "total": 213.99595390738622 + "total": 217.9102427907555 } } } diff --git a/tests/regression/baselines/benzene/axes_off.json b/tests/regression/baselines/benzene/axes_off.json index 65fd74d9..0bda87a1 100644 --- a/tests/regression/baselines/benzene/axes_off.json +++ b/tests/regression/baselines/benzene/axes_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.16163858692459776, - "united_atom:Rovibrational": 41.334360466552276, - "residue:FTmat-Transvibrational": 81.11811255841327, - "residue:FTmat-Rovibrational": 47.03606119622739, + "united_atom:Transvibrational": 0.17072733303436669, + "united_atom:Rovibrational": 38.707686995757996, + "residue:FTmat-Transvibrational": 78.01138885368493, + "residue:FTmat-Rovibrational": 47.12762732161061, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 169.65017280811753 + "total": 164.0174305040879 } } } diff --git a/tests/regression/baselines/benzene/combined_forcetorque_off.json b/tests/regression/baselines/benzene/combined_forcetorque_off.json index 3785730a..a7e97064 100644 --- a/tests/regression/baselines/benzene/combined_forcetorque_off.json +++ b/tests/regression/baselines/benzene/combined_forcetorque_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.1627566521736012, + "united_atom:Transvibrational": 0.20056759662549248, "united_atom:Rovibrational": 40.69581240789943, - "residue:Transvibrational": 61.39556854139587, - "residue:Rovibrational": 49.491721969907516, + "residue:Transvibrational": 60.612932277845054, + "residue:Rovibrational": 52.53948263906845, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 151.7458595713764 + "total": 154.04879492143843 } } } diff --git a/tests/regression/baselines/benzene/frame_window.json b/tests/regression/baselines/benzene/frame_window.json index c12b13b5..fa1b499d 100644 --- a/tests/regression/baselines/benzene/frame_window.json +++ b/tests/regression/baselines/benzene/frame_window.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 12.892173028619528, + "united_atom:Transvibrational": 13.02795056227694, "united_atom:Rovibrational": 34.98492056748487, - "residue:FTmat-Transvibrational": 71.74602192596502, - "residue:FTmat-Rovibrational": 55.81007796948714, + "residue:FTmat-Transvibrational": 75.50603474425519, + "residue:FTmat-Rovibrational": 54.88466842760241, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 175.43319349155655 + "total": 178.40357430161941 } } } diff --git a/tests/regression/baselines/benzene/grouping_each.json b/tests/regression/baselines/benzene/grouping_each.json index d6460fc6..f7141fa1 100644 --- a/tests/regression/baselines/benzene/grouping_each.json +++ b/tests/regression/baselines/benzene/grouping_each.json @@ -4,85 +4,85 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.001760679467943202, - "residue:FTmat-Transvibrational": 19.145391592336434, + "residue:FTmat-Transvibrational": 19.145391592336455, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 19.147152271804377 + "total": 19.147152271804398 }, "1": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.010093246924291217, - "residue:FTmat-Transvibrational": 15.27551568157707, + "residue:FTmat-Transvibrational": 15.27551568157708, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 15.089233620075317 }, - "total": 30.37484254857668 + "total": 30.374842548576687 }, "2": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.07511923174012403, - "residue:FTmat-Transvibrational": 20.32778524005574, + "residue:FTmat-Transvibrational": 20.327785240055753, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 15.089233620075317 }, - "total": 35.49213809187118 + "total": 35.4921380918712 }, "3": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.003820932771887749, - "residue:FTmat-Transvibrational": 9.934141461042106, + "residue:FTmat-Transvibrational": 9.9341414610421, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 9.937962393813994 + "total": 9.937962393813988 }, "4": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.026349364088976555, - "residue:FTmat-Transvibrational": 7.206801915761134, + "residue:FTmat-Transvibrational": 7.206801915761139, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 7.2331512798501105 + "total": 7.233151279850116 }, "5": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0015259047993877776, - "residue:FTmat-Transvibrational": 8.539848138171394, + "residue:FTmat-Transvibrational": 8.53984813817139, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 8.541374042970782 + "total": 8.541374042970778 }, "6": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0034710297151557107, - "residue:FTmat-Transvibrational": 15.46905995300999, + "residue:FTmat-Transvibrational": 15.469059953009985, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 15.472530982725146 + "total": 15.472530982725141 }, "7": { "components": { @@ -100,25 +100,25 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0006818502219972316, - "residue:FTmat-Transvibrational": 22.685475655857545, + "residue:FTmat-Transvibrational": 22.685475655857548, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 22.686157506079542 + "total": 22.686157506079546 }, "9": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.004115086801073575, - "residue:FTmat-Transvibrational": 5.894912294581267, + "residue:FTmat-Transvibrational": 5.894912294581265, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 5.89902738138234 + "total": 5.899027381382338 } } } diff --git a/tests/regression/baselines/benzene/selection_subset.json b/tests/regression/baselines/benzene/selection_subset.json index 6845abae..305235a8 100644 --- a/tests/regression/baselines/benzene/selection_subset.json +++ b/tests/regression/baselines/benzene/selection_subset.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.1627566521736012, + "united_atom:Transvibrational": 0.20056759662549248, "united_atom:Rovibrational": 40.69581240789943, - "residue:FTmat-Transvibrational": 83.31956662877224, - "residue:FTmat-Rovibrational": 45.37364572273796, + "residue:FTmat-Transvibrational": 76.91293922710581, + "residue:FTmat-Rovibrational": 46.20671256917539, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 169.55178141158322 + "total": 164.0160318008061 } } } diff --git a/tests/regression/baselines/cyclohexane/axes_off.json b/tests/regression/baselines/cyclohexane/axes_off.json index b132d553..4d7e406c 100644 --- a/tests/regression/baselines/cyclohexane/axes_off.json +++ b/tests/regression/baselines/cyclohexane/axes_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.8231608488813442, - "united_atom:Rovibrational": 24.764245274692822, - "residue:FTmat-Transvibrational": 84.05755363684698, - "residue:FTmat-Rovibrational": 61.73316378799838, + "united_atom:Transvibrational": 0.8145817540775688, + "united_atom:Rovibrational": 20.920529818990932, + "residue:FTmat-Transvibrational": 82.12187395021834, + "residue:FTmat-Rovibrational": 62.175794643302766, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 171.37812354841952 + "total": 166.03278016658962 } } } diff --git a/tests/regression/baselines/cyclohexane/combined_forcetorque_off.json b/tests/regression/baselines/cyclohexane/combined_forcetorque_off.json index 0a2e066f..118fca7a 100644 --- a/tests/regression/baselines/cyclohexane/combined_forcetorque_off.json +++ b/tests/regression/baselines/cyclohexane/combined_forcetorque_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.9083882969602073, + "united_atom:Transvibrational": 0.8699366681675057, "united_atom:Rovibrational": 24.234154676578637, - "residue:Transvibrational": 70.36545739512636, - "residue:Rovibrational": 69.36129379657234, + "residue:Transvibrational": 69.35706898246762, + "residue:Rovibrational": 67.4746212331719, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 164.86929416523753 + "total": 161.93578156038566 } } } diff --git a/tests/regression/baselines/cyclohexane/frame_window.json b/tests/regression/baselines/cyclohexane/frame_window.json index dfe949a7..ac78ac21 100644 --- a/tests/regression/baselines/cyclohexane/frame_window.json +++ b/tests/regression/baselines/cyclohexane/frame_window.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 19.83149926936752, + "united_atom:Transvibrational": 20.97191731367765, "united_atom:Rovibrational": 73.96792995794401, - "residue:FTmat-Transvibrational": 76.41867545283402, - "residue:FTmat-Rovibrational": 63.268579628257925, + "residue:FTmat-Transvibrational": 77.10544540698241, + "residue:FTmat-Rovibrational": 62.95050298578673, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 233.48668430840345 + "total": 234.9957956643908 } } } diff --git a/tests/regression/baselines/cyclohexane/grouping_each.json b/tests/regression/baselines/cyclohexane/grouping_each.json index f48d5fac..7be58aa8 100644 --- a/tests/regression/baselines/cyclohexane/grouping_each.json +++ b/tests/regression/baselines/cyclohexane/grouping_each.json @@ -4,13 +4,13 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0010533914066148877, - "residue:FTmat-Transvibrational": 13.25409426116816, + "residue:FTmat-Transvibrational": 13.254094261168165, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 13.255147652574774 + "total": 13.25514765257478 }, "1": { "components": { @@ -28,25 +28,25 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00010095873425357108, - "residue:FTmat-Transvibrational": 19.658853641209102, + "residue:FTmat-Transvibrational": 19.6588536412091, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 19.658954599943357 + "total": 19.658954599943353 }, "3": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0037293322355179833, - "residue:FTmat-Transvibrational": 11.234013572018535, + "residue:FTmat-Transvibrational": 11.234013572018538, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 11.237742904254052 + "total": 11.237742904254056 }, "4": { "components": { @@ -64,25 +64,25 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.02179378230989012, - "residue:FTmat-Transvibrational": 11.90922736546474, + "residue:FTmat-Transvibrational": 11.909227365464744, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 11.931021147774631 + "total": 11.931021147774635 }, "6": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0027492054614669612, - "residue:FTmat-Transvibrational": 17.43511242811532, + "residue:FTmat-Transvibrational": 17.435112428115314, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 17.437861633576787 + "total": 17.43786163357678 }, "7": { "components": { @@ -100,13 +100,13 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00022218804178093966, - "residue:FTmat-Transvibrational": 15.088914144240295, + "residue:FTmat-Transvibrational": 15.0889141442403, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 15.089136332282076 + "total": 15.08913633228208 }, "9": { "components": { diff --git a/tests/regression/baselines/cyclohexane/selection_subset.json b/tests/regression/baselines/cyclohexane/selection_subset.json index c4297f30..54496ce4 100644 --- a/tests/regression/baselines/cyclohexane/selection_subset.json +++ b/tests/regression/baselines/cyclohexane/selection_subset.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.9083882969602073, + "united_atom:Transvibrational": 0.8699366681675057, "united_atom:Rovibrational": 24.234154676578637, - "residue:FTmat-Transvibrational": 83.02143938359535, - "residue:FTmat-Rovibrational": 60.38982276412395, + "residue:FTmat-Transvibrational": 80.96654552718029, + "residue:FTmat-Rovibrational": 61.1146878757474, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 168.55380512125814 + "total": 167.18532474767383 } } } diff --git a/tests/regression/baselines/dna/axes_off.json b/tests/regression/baselines/dna/axes_off.json index 6a9dab72..66ee6fd6 100644 --- a/tests/regression/baselines/dna/axes_off.json +++ b/tests/regression/baselines/dna/axes_off.json @@ -3,30 +3,30 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 1.2910746542567035, + "united_atom:Rovibrational": 1.0595708621690758, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 26.68254629775581, - "polymer:FTmat-Transvibrational": 48.50274293414517, + "residue:Rovibrational": 28.25555780171021, + "polymer:FTmat-Transvibrational": 48.10401202541479, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 10.584542990557836, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 91.81981221334323 + "total": 92.76258901647961 }, "1": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 1.9680216598831306, + "united_atom:Rovibrational": 1.3193251286991976, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 24.831990780037884, - "polymer:FTmat-Transvibrational": 57.35678551116436, + "residue:Rovibrational": 24.96199001531892, + "polymer:FTmat-Transvibrational": 57.35678551116437, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 5.292271495278918, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 94.207974782992 + "total": 93.68927748708911 } } } diff --git a/tests/regression/baselines/dna/combined_forcetorque_off.json b/tests/regression/baselines/dna/combined_forcetorque_off.json index 339a1632..f1711ef1 100644 --- a/tests/regression/baselines/dna/combined_forcetorque_off.json +++ b/tests/regression/baselines/dna/combined_forcetorque_off.json @@ -5,14 +5,14 @@ "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0021606790121284584, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 3.3768006840852487, - "polymer:Transvibrational": 21.182662154911913, - "polymer:Rovibrational": 12.837576042626926, + "residue:Rovibrational": 3.376800684085247, + "polymer:Transvibrational": 21.18266215491191, + "polymer:Rovibrational": 12.837576042626923, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 42.15810489726393 + "total": 42.15810489726392 }, "1": { "components": { @@ -20,13 +20,13 @@ "united_atom:Rovibrational": 0.01846427765949588, "residue:Transvibrational": 0.0, "residue:Rovibrational": 2.386320108254459, - "polymer:Transvibrational": 16.607667396609127, - "polymer:Rovibrational": 12.304363914795598, + "polymer:Transvibrational": 16.607667396609134, + "polymer:Rovibrational": 12.304363914795605, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 36.075721033946394 + "total": 36.07572103394641 } } } diff --git a/tests/regression/baselines/dna/frame_window.json b/tests/regression/baselines/dna/frame_window.json index 82811387..23018395 100644 --- a/tests/regression/baselines/dna/frame_window.json +++ b/tests/regression/baselines/dna/frame_window.json @@ -5,28 +5,28 @@ "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 1.5821720528374947, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 26.60656641113743, - "polymer:FTmat-Transvibrational": 48.50274293414517, + "residue:Rovibrational": 28.153090862826048, + "polymer:FTmat-Transvibrational": 48.10401202541479, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 10.584542990557836, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 92.03492972530563 + "total": 93.18272326826387 }, "1": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 2.527793636620802, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 24.4275653595082, - "polymer:FTmat-Transvibrational": 57.35678551116436, + "residue:Rovibrational": 24.738836376104466, + "polymer:FTmat-Transvibrational": 57.35678551116437, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 5.292271495278918, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 94.3633213392 + "total": 94.67459235579626 } } } diff --git a/tests/regression/baselines/dna/grouping_each.json b/tests/regression/baselines/dna/grouping_each.json index 1e29fb1c..b5d797f1 100644 --- a/tests/regression/baselines/dna/grouping_each.json +++ b/tests/regression/baselines/dna/grouping_each.json @@ -5,14 +5,14 @@ "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0021606790121284584, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 3.3768006840852487, + "residue:Rovibrational": 3.376800684085247, "polymer:FTmat-Transvibrational": 12.341104347192614, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 20.478971046917703 + "total": 20.4789710469177 }, "1": { "components": { @@ -20,13 +20,13 @@ "united_atom:Rovibrational": 0.01846427765949588, "residue:Transvibrational": 0.0, "residue:Rovibrational": 2.386320108254459, - "polymer:FTmat-Transvibrational": 11.110372533885968, + "polymer:FTmat-Transvibrational": 11.110372533885974, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 18.274062256427637 + "total": 18.27406225642764 } } } diff --git a/tests/regression/baselines/dna/selection_subset.json b/tests/regression/baselines/dna/selection_subset.json index 1e29fb1c..b5d797f1 100644 --- a/tests/regression/baselines/dna/selection_subset.json +++ b/tests/regression/baselines/dna/selection_subset.json @@ -5,14 +5,14 @@ "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0021606790121284584, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 3.3768006840852487, + "residue:Rovibrational": 3.376800684085247, "polymer:FTmat-Transvibrational": 12.341104347192614, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 20.478971046917703 + "total": 20.4789710469177 }, "1": { "components": { @@ -20,13 +20,13 @@ "united_atom:Rovibrational": 0.01846427765949588, "residue:Transvibrational": 0.0, "residue:Rovibrational": 2.386320108254459, - "polymer:FTmat-Transvibrational": 11.110372533885968, + "polymer:FTmat-Transvibrational": 11.110372533885974, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 18.274062256427637 + "total": 18.27406225642764 } } } diff --git a/tests/regression/baselines/ethyl-acetate/axes_off.json b/tests/regression/baselines/ethyl-acetate/axes_off.json index a33ca378..25ce7054 100644 --- a/tests/regression/baselines/ethyl-acetate/axes_off.json +++ b/tests/regression/baselines/ethyl-acetate/axes_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 1.0264523212404142, - "united_atom:Rovibrational": 78.59041516704335, - "residue:FTmat-Transvibrational": 81.02749922723585, - "residue:FTmat-Rovibrational": 56.27644205458492, + "united_atom:Transvibrational": 1.4321699433975792, + "united_atom:Rovibrational": 78.46273034643444, + "residue:FTmat-Transvibrational": 75.78420694132267, + "residue:FTmat-Rovibrational": 56.746114081365306, "united_atom:Conformational": 7.90098624365273, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 224.82179501375725 + "total": 220.32620755617273 } } } diff --git a/tests/regression/baselines/ethyl-acetate/combined_forcetorque_off.json b/tests/regression/baselines/ethyl-acetate/combined_forcetorque_off.json index 31ef492c..acd7f023 100644 --- a/tests/regression/baselines/ethyl-acetate/combined_forcetorque_off.json +++ b/tests/regression/baselines/ethyl-acetate/combined_forcetorque_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 1.0945863942121685, + "united_atom:Transvibrational": 1.4321328326710805, "united_atom:Rovibrational": 82.3645515427813, - "residue:Transvibrational": 68.30761200383697, - "residue:Rovibrational": 59.2965466793037, + "residue:Transvibrational": 65.5584231350494, + "residue:Rovibrational": 62.5487898763503, "united_atom:Conformational": 7.90098624365273, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 218.96428286378688 + "total": 219.80488363050483 } } } diff --git a/tests/regression/baselines/ethyl-acetate/frame_window.json b/tests/regression/baselines/ethyl-acetate/frame_window.json index f89758d4..a39111db 100644 --- a/tests/regression/baselines/ethyl-acetate/frame_window.json +++ b/tests/regression/baselines/ethyl-acetate/frame_window.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 29.40579085610341, + "united_atom:Transvibrational": 28.00207772060564, "united_atom:Rovibrational": 51.990361428188855, - "residue:FTmat-Transvibrational": 67.03974115661572, - "residue:FTmat-Rovibrational": 55.06851959311436, + "residue:FTmat-Transvibrational": 69.58906302725345, + "residue:FTmat-Rovibrational": 54.42083576024036, "united_atom:Conformational": 8.635471458692102, "residue:Conformational": 0.0, "residue:Orientational": 3.8984476469128193 }, - "total": 216.03833213962727 + "total": 216.5362570418932 } } } diff --git a/tests/regression/baselines/ethyl-acetate/grouping_each.json b/tests/regression/baselines/ethyl-acetate/grouping_each.json index 6fa62cfb..8ed0c003 100644 --- a/tests/regression/baselines/ethyl-acetate/grouping_each.json +++ b/tests/regression/baselines/ethyl-acetate/grouping_each.json @@ -4,25 +4,25 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.041680247513564424, - "residue:FTmat-Transvibrational": 13.339420001372433, + "residue:FTmat-Transvibrational": 13.339420001372426, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 13.381100248885998 + "total": 13.381100248885991 }, "1": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.1351925826754994, - "residue:FTmat-Transvibrational": 17.260433457821385, + "residue:FTmat-Transvibrational": 17.260433457821392, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 17.395626040496886 + "total": 17.395626040496893 }, "2": { "components": { @@ -40,61 +40,61 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.08920089761061602, - "residue:FTmat-Transvibrational": 17.34932045847677, + "residue:FTmat-Transvibrational": 17.349320458476765, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 17.43852135608739 + "total": 17.43852135608738 }, "4": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.2458732018262139, - "residue:FTmat-Transvibrational": 14.544753730547699, + "residue:FTmat-Transvibrational": 14.544753730547697, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 14.790626932373913 + "total": 14.790626932373911 }, "5": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.02678845348921013, - "residue:FTmat-Transvibrational": 9.570910150584444, + "residue:FTmat-Transvibrational": 9.570910150584446, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 9.597698604073654 + "total": 9.597698604073656 }, "6": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.05229804005112911, - "residue:FTmat-Transvibrational": 12.801663361822174, + "residue:FTmat-Transvibrational": 12.801663361822166, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 12.853961401873303 + "total": 12.853961401873296 }, "7": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.29162538377256336, - "residue:FTmat-Transvibrational": 16.40926078565227, + "residue:FTmat-Transvibrational": 16.409260785652272, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 16.70088616942483 + "total": 16.700886169424834 }, "8": { "components": { diff --git a/tests/regression/baselines/ethyl-acetate/selection_subset.json b/tests/regression/baselines/ethyl-acetate/selection_subset.json index e8befd41..e9f6818f 100644 --- a/tests/regression/baselines/ethyl-acetate/selection_subset.json +++ b/tests/regression/baselines/ethyl-acetate/selection_subset.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 1.0945863942121685, + "united_atom:Transvibrational": 1.4321328326710805, "united_atom:Rovibrational": 82.3645515427813, - "residue:FTmat-Transvibrational": 79.3546113986704, - "residue:FTmat-Rovibrational": 55.58023277682395, + "residue:FTmat-Transvibrational": 75.17407583425236, + "residue:FTmat-Rovibrational": 56.01290067233877, "united_atom:Conformational": 7.90098624365273, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 226.29496835614057 + "total": 222.88464712569626 } } } diff --git a/tests/regression/baselines/methane/axes_off.json b/tests/regression/baselines/methane/axes_off.json index 5eac4338..c5f3cb2f 100644 --- a/tests/regression/baselines/methane/axes_off.json +++ b/tests/regression/baselines/methane/axes_off.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 42.71309458819117, - "united_atom:Rovibrational": 34.49645268839667, + "united_atom:Transvibrational": 45.405237016017985, + "united_atom:Rovibrational": 33.30477892995319, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 77.20954727658784 + "total": 78.71001594597118 } } } diff --git a/tests/regression/baselines/methane/combined_forcetorque_off.json b/tests/regression/baselines/methane/combined_forcetorque_off.json index 5b4ce51c..0e4d512c 100644 --- a/tests/regression/baselines/methane/combined_forcetorque_off.json +++ b/tests/regression/baselines/methane/combined_forcetorque_off.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 42.71309458819117, - "united_atom:Rovibrational": 34.44108294190893, + "united_atom:Transvibrational": 45.405237016017985, + "united_atom:Rovibrational": 33.24522051603423, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 77.1541775301001 + "total": 78.65045753205222 } } } diff --git a/tests/regression/baselines/methane/frame_window.json b/tests/regression/baselines/methane/frame_window.json index 99458e41..29a58057 100644 --- a/tests/regression/baselines/methane/frame_window.json +++ b/tests/regression/baselines/methane/frame_window.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 40.546757804157515, - "united_atom:Rovibrational": 33.43627689514928, + "united_atom:Transvibrational": 40.53088385916688, + "united_atom:Rovibrational": 34.010057184978606, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 73.98303469930678 + "total": 74.54094104414548 } } } diff --git a/tests/regression/baselines/methane/grouping_each.json b/tests/regression/baselines/methane/grouping_each.json index 949e9969..8e723dab 100644 --- a/tests/regression/baselines/methane/grouping_each.json +++ b/tests/regression/baselines/methane/grouping_each.json @@ -3,29 +3,29 @@ "0": { "components": { "united_atom:Transvibrational": 24.315699188266905, - "united_atom:Rovibrational": 21.04839012420562, + "united_atom:Rovibrational": 21.048390124205607, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 45.36408931247253 + "total": 45.364089312472515 }, "1": { "components": { "united_atom:Transvibrational": 23.766082670463117, - "united_atom:Rovibrational": 16.769636839671318, + "united_atom:Rovibrational": 16.769636839671286, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 40.535719510134435 + "total": 40.5357195101344 }, "2": { "components": { - "united_atom:Transvibrational": 24.83389621978833, - "united_atom:Rovibrational": 16.996392060962343, + "united_atom:Transvibrational": 24.833896219788343, + "united_atom:Rovibrational": 16.99639206096234, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 41.83028828075067 + "total": 41.83028828075068 }, "3": { "components": { @@ -38,12 +38,12 @@ }, "4": { "components": { - "united_atom:Transvibrational": 6.880461178899526, - "united_atom:Rovibrational": 4.441585994100293, + "united_atom:Transvibrational": 6.880461178899528, + "united_atom:Rovibrational": 4.441585994100294, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 11.322047172999818 + "total": 11.322047172999822 }, "5": { "components": { @@ -57,38 +57,38 @@ "6": { "components": { "united_atom:Transvibrational": 25.694168010993906, - "united_atom:Rovibrational": 6.731392483940259, + "united_atom:Rovibrational": 6.731392483940268, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 32.42556049493417 + "total": 32.425560494934174 }, "7": { "components": { - "united_atom:Transvibrational": 10.533257828925988, - "united_atom:Rovibrational": 8.975639133015862, + "united_atom:Transvibrational": 10.533257828925992, + "united_atom:Rovibrational": 8.975639133015871, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 19.50889696194185 + "total": 19.508896961941865 }, "8": { "components": { "united_atom:Transvibrational": 7.332978272264892, - "united_atom:Rovibrational": 3.0418502362906055, + "united_atom:Rovibrational": 3.0418502362906077, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 10.374828508555497 + "total": 10.374828508555499 }, "9": { "components": { "united_atom:Transvibrational": 4.023932761002867, - "united_atom:Rovibrational": 8.289324383636096, + "united_atom:Rovibrational": 8.289324383636105, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 12.313257144638964 + "total": 12.313257144638971 } } } diff --git a/tests/regression/baselines/methane/selection_subset.json b/tests/regression/baselines/methane/selection_subset.json index 5b4ce51c..0e4d512c 100644 --- a/tests/regression/baselines/methane/selection_subset.json +++ b/tests/regression/baselines/methane/selection_subset.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 42.71309458819117, - "united_atom:Rovibrational": 34.44108294190893, + "united_atom:Transvibrational": 45.405237016017985, + "united_atom:Rovibrational": 33.24522051603423, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 77.1541775301001 + "total": 78.65045753205222 } } } diff --git a/tests/regression/baselines/methanol/axes_off.json b/tests/regression/baselines/methanol/axes_off.json index 20724634..2d431fbf 100644 --- a/tests/regression/baselines/methanol/axes_off.json +++ b/tests/regression/baselines/methanol/axes_off.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 40.225584031848285, - "residue:FTmat-Transvibrational": 80.99617693970961, - "residue:FTmat-Rovibrational": 39.57294744515248, + "united_atom:Rovibrational": 41.19579286890263, + "residue:FTmat-Transvibrational": 73.48764222316326, + "residue:FTmat-Rovibrational": 40.99443237927875, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 160.79470841671036 + "total": 155.67786747134465 } } } diff --git a/tests/regression/baselines/methanol/combined_forcetorque_off.json b/tests/regression/baselines/methanol/combined_forcetorque_off.json index 84e6fb22..2165d8a2 100644 --- a/tests/regression/baselines/methanol/combined_forcetorque_off.json +++ b/tests/regression/baselines/methanol/combined_forcetorque_off.json @@ -4,13 +4,13 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 49.59060714158679, - "residue:Transvibrational": 63.011170818927425, - "residue:Rovibrational": 31.631180680507523, + "residue:Transvibrational": 62.67397919657055, + "residue:Rovibrational": 33.87563561907027, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 144.23295864102172 + "total": 146.1402219572276 } } } diff --git a/tests/regression/baselines/methanol/frame_window.json b/tests/regression/baselines/methanol/frame_window.json index 079f0cc2..2d402dba 100644 --- a/tests/regression/baselines/methanol/frame_window.json +++ b/tests/regression/baselines/methanol/frame_window.json @@ -4,13 +4,13 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 34.6755419354061, - "residue:FTmat-Transvibrational": 63.22483760687048, - "residue:FTmat-Rovibrational": 29.43214053441657, + "residue:FTmat-Transvibrational": 62.942440400794176, + "residue:FTmat-Rovibrational": 29.12139211619086, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 127.33252007669316 + "total": 126.73937445239113 } } } diff --git a/tests/regression/baselines/methanol/grouping_each.json b/tests/regression/baselines/methanol/grouping_each.json index 8d3a25e0..55cce68d 100644 --- a/tests/regression/baselines/methanol/grouping_each.json +++ b/tests/regression/baselines/methanol/grouping_each.json @@ -100,13 +100,13 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 1.3866864927610842, - "residue:FTmat-Transvibrational": 7.095998287789704, + "residue:FTmat-Transvibrational": 7.095998287789705, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 8.482684780550787 + "total": 8.48268478055079 }, "9": { "components": { diff --git a/tests/regression/baselines/methanol/selection_subset.json b/tests/regression/baselines/methanol/selection_subset.json index aa37195f..c934f7ce 100644 --- a/tests/regression/baselines/methanol/selection_subset.json +++ b/tests/regression/baselines/methanol/selection_subset.json @@ -4,13 +4,13 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 49.59060714158679, - "residue:FTmat-Transvibrational": 78.60873072810506, - "residue:FTmat-Rovibrational": 27.28134724177411, + "residue:FTmat-Transvibrational": 73.07680599953918, + "residue:FTmat-Rovibrational": 28.311572968947917, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 155.48068511146596 + "total": 150.9789861100739 } } } diff --git a/tests/regression/baselines/octonol/axes_off.json b/tests/regression/baselines/octonol/axes_off.json index dccb7c6f..96f849d5 100644 --- a/tests/regression/baselines/octonol/axes_off.json +++ b/tests/regression/baselines/octonol/axes_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.3946170181442213, - "united_atom:Rovibrational": 13.42009963284138, - "residue:FTmat-Transvibrational": 88.89652899239388, - "residue:FTmat-Rovibrational": 59.284611948411424, + "united_atom:Transvibrational": 0.2813477461801644, + "united_atom:Rovibrational": 11.777756530643426, + "residue:FTmat-Transvibrational": 81.9451817383594, + "residue:FTmat-Rovibrational": 59.553917441172246, "united_atom:Conformational": 16.83949354267619, "residue:Conformational": 0.0, "residue:Orientational": 25.79114991860739 }, - "total": 204.6265010530745 + "total": 196.18884691763878 } } } diff --git a/tests/regression/baselines/octonol/combined_forcetorque_off.json b/tests/regression/baselines/octonol/combined_forcetorque_off.json index 94f8b1a9..91be627e 100644 --- a/tests/regression/baselines/octonol/combined_forcetorque_off.json +++ b/tests/regression/baselines/octonol/combined_forcetorque_off.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.35379238473384655, + "united_atom:Transvibrational": 0.2801426785866467, "united_atom:Rovibrational": 19.154228264604267, - "residue:Transvibrational": 73.4888773906637, - "residue:Rovibrational": 61.888014555961526, + "residue:Transvibrational": 73.10868503314676, + "residue:Rovibrational": 61.50929695375962, "united_atom:Conformational": 16.83949354267619, "residue:Conformational": 0.0, "residue:Orientational": 25.79114991860739 }, - "total": 197.5155560572469 + "total": 196.68299639138087 } } } diff --git a/tests/regression/baselines/octonol/frame_window.json b/tests/regression/baselines/octonol/frame_window.json index f36623a1..bcb2c2b9 100644 --- a/tests/regression/baselines/octonol/frame_window.json +++ b/tests/regression/baselines/octonol/frame_window.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 70.87271844699075, + "united_atom:Transvibrational": 71.9625416292299, "united_atom:Rovibrational": 162.26463085986254, - "residue:FTmat-Transvibrational": 74.64608750357672, - "residue:FTmat-Rovibrational": 60.91083610153494, + "residue:FTmat-Transvibrational": 76.7667616108701, + "residue:FTmat-Rovibrational": 60.17313284253718, "united_atom:Conformational": 16.651144380045313, "residue:Conformational": 0.0, "residue:Orientational": 25.79114991860739 }, - "total": 411.1365672106176 + "total": 413.60936124115244 } } } diff --git a/tests/regression/baselines/octonol/grouping_each.json b/tests/regression/baselines/octonol/grouping_each.json index dc2c9057..536a151a 100644 --- a/tests/regression/baselines/octonol/grouping_each.json +++ b/tests/regression/baselines/octonol/grouping_each.json @@ -16,7 +16,7 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00013794104464519378, - "residue:FTmat-Transvibrational": 14.571797812433093, + "residue:FTmat-Transvibrational": 14.571797812433097, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, @@ -40,13 +40,13 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.0031285818933102097, - "residue:FTmat-Transvibrational": 21.241358919104748, + "residue:FTmat-Transvibrational": 21.241358919104755, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 21.24448750099806 + "total": 21.244487500998066 }, "4": { "components": { @@ -64,25 +64,25 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.005775850934008876, - "residue:FTmat-Transvibrational": 7.615636453348772, + "residue:FTmat-Transvibrational": 7.61563645334877, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 7.621412304282781 + "total": 7.621412304282779 }, "6": { "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00028812747686091, - "residue:FTmat-Transvibrational": 16.555914111511562, + "residue:FTmat-Transvibrational": 16.555914111511573, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 0.0 }, - "total": 16.556202238988423 + "total": 16.556202238988433 }, "7": { "components": { @@ -112,7 +112,7 @@ "components": { "united_atom:Transvibrational": 0.0, "united_atom:Rovibrational": 0.00015446787843376823, - "residue:FTmat-Transvibrational": 20.977612663758993, + "residue:FTmat-Transvibrational": 20.97761266375899, "residue:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, diff --git a/tests/regression/baselines/octonol/selection_subset.json b/tests/regression/baselines/octonol/selection_subset.json index b3c6cf87..280f05b5 100644 --- a/tests/regression/baselines/octonol/selection_subset.json +++ b/tests/regression/baselines/octonol/selection_subset.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 0.35379238473384655, + "united_atom:Transvibrational": 0.2801426785866467, "united_atom:Rovibrational": 19.154228264604267, - "residue:FTmat-Transvibrational": 85.63275438200148, - "residue:FTmat-Rovibrational": 57.14905396128441, + "residue:FTmat-Transvibrational": 82.11968297566693, + "residue:FTmat-Rovibrational": 57.71012488478221, "united_atom:Conformational": 16.83949354267619, "residue:Conformational": 0.0, "residue:Orientational": 25.79114991860739 }, - "total": 204.92047245390756 + "total": 201.89482226492362 } } } diff --git a/tests/regression/baselines/water/axes_off.json b/tests/regression/baselines/water/axes_off.json index 855b3e0b..ec47bd85 100644 --- a/tests/regression/baselines/water/axes_off.json +++ b/tests/regression/baselines/water/axes_off.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 50.29463976726311, - "united_atom:Rovibrational": 17.75547865377748, + "united_atom:Transvibrational": 49.78087138438188, + "united_atom:Rovibrational": 18.360896655959607, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 68.0501184210406 + "total": 68.14176804034149 } } } diff --git a/tests/regression/baselines/water/combined_forcetorque_off.json b/tests/regression/baselines/water/combined_forcetorque_off.json index e3ff82df..f2c917b9 100644 --- a/tests/regression/baselines/water/combined_forcetorque_off.json +++ b/tests/regression/baselines/water/combined_forcetorque_off.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 50.29463976726311, - "united_atom:Rovibrational": 17.795473940796423, + "united_atom:Transvibrational": 49.78087138438188, + "united_atom:Rovibrational": 18.241329771851756, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 68.09011370805953 + "total": 68.02220115623363 } } } diff --git a/tests/regression/baselines/water/frame_window.json b/tests/regression/baselines/water/frame_window.json index 3260da14..58329f9e 100644 --- a/tests/regression/baselines/water/frame_window.json +++ b/tests/regression/baselines/water/frame_window.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 46.294728006800256, - "united_atom:Rovibrational": 17.257985709030912, + "united_atom:Transvibrational": 46.361096977161964, + "united_atom:Rovibrational": 17.208799819818985, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 63.55271371583117 + "total": 63.56989679698095 } } } diff --git a/tests/regression/baselines/water/grouping_each.json b/tests/regression/baselines/water/grouping_each.json index f14a07e9..c88ee7c1 100644 --- a/tests/regression/baselines/water/grouping_each.json +++ b/tests/regression/baselines/water/grouping_each.json @@ -2,26 +2,26 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 14.945907953805547, - "united_atom:Rovibrational": 1.894724395364822, + "united_atom:Transvibrational": 14.945907953805552, + "united_atom:Rovibrational": 1.8947243953648225, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 16.84063234917037 + "total": 16.840632349170374 }, "1": { "components": { "united_atom:Transvibrational": 8.111522208287775, - "united_atom:Rovibrational": 0.9607747968334228, + "united_atom:Rovibrational": 0.960774796833424, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 9.072297005121198 + "total": 9.0722970051212 }, "2": { "components": { - "united_atom:Transvibrational": 15.794973479687595, - "united_atom:Rovibrational": 4.606072530590256, + "united_atom:Transvibrational": 15.794973479687597, + "united_atom:Rovibrational": 4.606072530590255, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, @@ -29,30 +29,30 @@ }, "3": { "components": { - "united_atom:Transvibrational": 9.462487265119444, + "united_atom:Transvibrational": 9.462487265119448, "united_atom:Rovibrational": 1.6509513986984767, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 11.11343866381792 + "total": 11.113438663817924 }, "4": { "components": { - "united_atom:Transvibrational": 16.254161245740693, + "united_atom:Transvibrational": 16.254161245740683, "united_atom:Rovibrational": 1.3675973741107645, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 17.62175861985146 + "total": 17.621758619851448 }, "5": { "components": { "united_atom:Transvibrational": 11.577798762033282, - "united_atom:Rovibrational": 7.3511635680049485, + "united_atom:Rovibrational": 7.351163568004953, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 18.92896233003823 + "total": 18.928962330038235 }, "6": { "components": { diff --git a/tests/regression/baselines/water/selection_subset.json b/tests/regression/baselines/water/selection_subset.json index e3ff82df..f2c917b9 100644 --- a/tests/regression/baselines/water/selection_subset.json +++ b/tests/regression/baselines/water/selection_subset.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 50.29463976726311, - "united_atom:Rovibrational": 17.795473940796423, + "united_atom:Transvibrational": 49.78087138438188, + "united_atom:Rovibrational": 18.241329771851756, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 68.09011370805953 + "total": 68.02220115623363 } } } diff --git a/tests/regression/baselines/water/water_off.json b/tests/regression/baselines/water/water_off.json index e3ff82df..f2c917b9 100644 --- a/tests/regression/baselines/water/water_off.json +++ b/tests/regression/baselines/water/water_off.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 50.29463976726311, - "united_atom:Rovibrational": 17.795473940796423, + "united_atom:Transvibrational": 49.78087138438188, + "united_atom:Rovibrational": 18.241329771851756, "united_atom:Conformational": 0.0, "united_atom:Orientational": 0.0 }, - "total": 68.09011370805953 + "total": 68.02220115623363 } } } From 3aed947ca8b196e89fe6e24cd30171cc516ded68 Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Thu, 8 Oct 2026 11:27:37 +0100 Subject: [PATCH 09/12] tests(unit): mock moment of inertia in UA axes error test --- tests/unit/CodeEntropy/levels/test_axes.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/unit/CodeEntropy/levels/test_axes.py b/tests/unit/CodeEntropy/levels/test_axes.py index 594b5c67..0fdb9535 100644 --- a/tests/unit/CodeEntropy/levels/test_axes.py +++ b/tests/unit/CodeEntropy/levels/test_axes.py @@ -129,7 +129,6 @@ def test_get_residue_axes_one_residue_uses_principal_axes(monkeypatch): u = MagicMock() u.dimensions = np.array([10.0, 10.0, 10.0, 90, 90, 90]) - u.atoms.principal_axes.return_value = np.eye(3) # atom_set non-empty => bonded branch def _select_atoms(q): @@ -159,7 +158,6 @@ def test_get_UA_axes_uses_principal_axes_when_single_heavy(monkeypatch): ax = AxesCalculator() u = MagicMock() u.dimensions = np.array([10.0, 10.0, 10.0, 90, 90, 90]) - u.atoms.principal_axes.return_value = np.eye(3) u.center_of_mass.return_value = np.array([[4.0, 0.0, 0.0]]) # heavy_atoms length <= 1 => principal_axes path @@ -666,13 +664,11 @@ def test_get_residue_axes_one_residue_principal_axes_path(monkeypatch): residue = MagicMock() residue.__len__.return_value = 1 - residue.atoms.principal_axes.return_value = np.eye(3) * 2 residue.atoms.center_of_mass.return_value = np.array([1.0, 2.0, 3.0]) residue.center_of_mass.return_value = np.array([1.0, 2.0, 3.0]) u = MagicMock() u.dimensions = np.array([10.0, 10.0, 10.0, 90, 90, 90]) - u.atoms.principal_axes.return_value = np.eye(3) * 2 def _select_atoms(q): if q.startswith("(resindex"): @@ -1788,7 +1784,7 @@ def _select_atoms(q): def test_get_UA_axes_raises_when_only_rot_axes_fail(monkeypatch): ax = AxesCalculator() u = MagicMock() - u.atoms.principal_axes.return_value = np.eye(3) + u.atoms.atoms.moment_of_inertia.return_value = np.diag([3.0, 2.0, 1.0]) u.dimensions = np.array([10.0, 10.0, 10.0, 90, 90, 90]) heavy_atoms = [ _atom(index=0, mass=12.0, pos=(1, 0, 0)), From 05c7ce415d87504c0608d8d84d7435e17d773d0e Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Thu, 8 Oct 2026 12:18:29 +0100 Subject: [PATCH 10/12] refactor(axes): simplify canonical axes and clarify function names --- CodeEntropy/levels/axes.py | 188 ++++++++--------- CodeEntropy/levels/nodes/covariance.py | 12 +- .../levels/nodes/test_covariance_node.py | 20 +- tests/unit/CodeEntropy/levels/test_axes.py | 199 ++++++++++-------- 4 files changed, 206 insertions(+), 213 deletions(-) diff --git a/CodeEntropy/levels/axes.py b/CodeEntropy/levels/axes.py index cf5531c8..03a6cc0a 100644 --- a/CodeEntropy/levels/axes.py +++ b/CodeEntropy/levels/axes.py @@ -144,12 +144,14 @@ def get_residue_axes( masses=ua_masses, dimensions=data_container.dimensions[:3], ) - rot_axes, moment_of_inertia = self.get_custom_principal_axes(moi_tensor) + rot_axes, moment_of_inertia = self.get_principal_axes_from_tensor( + moi_tensor + ) trans_axes = rot_axes # per original convention rot_center = np.array(residue.center_of_mass()) else: make_whole(data_container.atoms) - trans_axes = self.get_principal_axes(data_container.atoms) + trans_axes = self.get_principal_axes_from_group(data_container.atoms) if len(edge_atom_set) == 1: edge_atom = edge_atom_set[0] rot_center, rot_axes = self.get_terminal_axes( @@ -217,14 +219,14 @@ def get_residue_axes_from_topology( masses=topology.residue_ua_masses, dimensions=dimensions, ) - rot_axes, moment_of_inertia = self.get_custom_principal_axes( + rot_axes, moment_of_inertia = self.get_principal_axes_from_tensor( moment_of_inertia_tensor ) trans_axes = rot_axes else: make_whole(mol.atoms) - trans_axes = self.get_principal_axes(mol.atoms) - rot_axes, moment_of_inertia = self.get_vanilla_axes(residue_atoms) + trans_axes = self.get_principal_axes_from_group(mol.atoms) + rot_axes, moment_of_inertia = self.get_molecule_axes(residue_atoms) center = residue_atoms.center_of_mass(unwrap=True) return trans_axes, rot_axes, center, moment_of_inertia @@ -281,7 +283,7 @@ def get_UA_axes(self, data_container, index: int, res_position): # only the one residue => use principal axes residue = data_container trans_center = data_container.atoms.center_of_mass(unwrap=True) - trans_axes = self.get_principal_axes(data_container.atoms) + trans_axes = self.get_principal_axes_from_group(data_container.atoms) else: # residue of interest has at least one neighbour if res_position == -1 or res_position == 1: @@ -416,12 +418,12 @@ def get_UA_axes_from_topology( masses=topology.residue_ua_masses, dimensions=dimensions, ) - trans_axes, _moment_of_inertia = self.get_custom_principal_axes( + trans_axes, _moment_of_inertia = self.get_principal_axes_from_tensor( moment_of_inertia_tensor ) else: make_whole(residue_atoms) - trans_axes = self.get_principal_axes(residue_atoms) + trans_axes = self.get_principal_axes_from_group(residue_atoms) center = heavy_atom.position rot_axes, moment_of_inertia = self.get_bonded_axes_from_topology( @@ -478,10 +480,10 @@ def get_bonded_axes_from_topology( ua_all = u.atoms[topology.ua_all_atom_indices] if len(heavy_bonded) == 0: - custom_axes, custom_moment_of_inertia = self.get_vanilla_axes(ua_all) + custom_axes, custom_moment_of_inertia = self.get_molecule_axes(ua_all) if len(heavy_bonded) == 1 and len(light_bonded) == 0: - custom_axes = self.get_custom_axes( + custom_axes = self.get_bonded_vector_axes( a=heavy_atom.position, b_list=[heavy_bonded[0].position], c=np.zeros(3), @@ -489,7 +491,7 @@ def get_bonded_axes_from_topology( ) if len(heavy_bonded) == 1 and len(light_bonded) >= 1: - custom_axes = self.get_custom_axes( + custom_axes = self.get_bonded_vector_axes( a=heavy_atom.position, b_list=[heavy_bonded[0].position], c=light_bonded[0].position, @@ -497,7 +499,7 @@ def get_bonded_axes_from_topology( ) if len(heavy_bonded) >= 2: - custom_axes = self.get_custom_axes( + custom_axes = self.get_bonded_vector_axes( a=heavy_atom.position, b_list=heavy_bonded.positions, c=heavy_bonded[1].position, @@ -611,7 +613,7 @@ def get_terminal_axes(self, residue, edge, dimensions): if len(bonded_atoms) == 0: # there is only one heavy atom in the residue rot_center = edge.position - rot_axes = self.get_principal_axes(residue.atoms) + rot_axes = self.get_principal_axes_from_group(residue.atoms) else: average_bonded = np.zeros(3) for bonded_atom in bonded_atoms: @@ -632,7 +634,7 @@ def get_terminal_axes(self, residue, edge, dimensions): ) else: rot_center = edge.position - rot_axes = self.get_custom_axes( + rot_axes = self.get_bonded_vector_axes( a=edge.position, b_list=[average_bonded], c=np.zeros(3), @@ -672,7 +674,7 @@ def get_non_terminal_axes(self, residue, edges, dimensions): ) else: rot_center = (edges[0].position + edges[1].position) / 2 - rot_axes = self.get_custom_axes( + rot_axes = self.get_bonded_vector_axes( a=rot_center, b_list=[edges[0].position], c=np.zeros(3), @@ -749,11 +751,11 @@ def get_bonded_axes(self, system, atom, dimensions: np.ndarray): # case1 if len(heavy_bonded) == 0: - custom_axes, custom_moment_of_inertia = self.get_vanilla_axes(ua_all) + custom_axes, custom_moment_of_inertia = self.get_molecule_axes(ua_all) # case2 if len(heavy_bonded) == 1 and len(light_bonded) == 0: - custom_axes = self.get_custom_axes( + custom_axes = self.get_bonded_vector_axes( a=atom.position, b_list=[heavy_bonded[0].position], c=np.zeros(3), @@ -762,7 +764,7 @@ def get_bonded_axes(self, system, atom, dimensions: np.ndarray): # case3 if len(heavy_bonded) == 1 and len(light_bonded) >= 1: - custom_axes = self.get_custom_axes( + custom_axes = self.get_bonded_vector_axes( a=atom.position, b_list=[heavy_bonded[0].position], c=light_bonded[0].position, @@ -772,7 +774,7 @@ def get_bonded_axes(self, system, atom, dimensions: np.ndarray): # case4 (not used in original 2019 code; case5 used instead) # case5 if len(heavy_bonded) >= 2: - custom_axes = self.get_custom_axes( + custom_axes = self.get_bonded_vector_axes( a=atom.position, b_list=heavy_bonded.positions, c=heavy_bonded[1].position, @@ -812,14 +814,12 @@ def find_bonded_atoms(self, atom_idx: int, system): bonded_H_atoms = bonded_atoms.select_atoms("mass 1 to 1.1") return bonded_heavy_atoms, bonded_H_atoms - def get_vanilla_axes(self, molecule): - """Get principal axes and sorted principal moments (vanilla method). + def get_molecule_axes(self, molecule): + """Get principal axes and sorted principal moments. Compute the principal axes and moments of inertia for a molecule from its moment of inertia tensor. - The original description is preserved: - - The molecule is made whole to ensure correct handling of PBC. The tensor is taken after that, so it does not depend on where the molecule sits relative to the periodic boundary. @@ -836,10 +836,9 @@ def get_vanilla_axes(self, molecule): - moment_of_inertia: (3,) moments sorted descending by absolute value. """ make_whole(molecule.atoms) - moment_of_inertia_tensor = molecule.moment_of_inertia() - return self.get_reproducible_axes(moment_of_inertia_tensor) + return self.get_principal_axes_from_tensor(molecule.moment_of_inertia()) - def get_custom_axes( + def get_bonded_vector_axes( self, a: np.ndarray, b_list: Sequence[np.ndarray], @@ -1071,96 +1070,75 @@ def get_moment_of_inertia_tensor( return moment_of_inertia_tensor - def get_custom_principal_axes( - self, moment_of_inertia_tensor: np.ndarray - ) -> tuple[np.ndarray, np.ndarray]: - """Compute principal axes and moments from a custom MOI tensor. - - Principal axes and moments from the ordered eigenvalues and eigenvectors of - a moment of inertia tensor. This function allows for a custom moment of - inertia tensor to be used. The axes are made reproducible by - :meth:`get_reproducible_axes`. - - Args: - moment_of_inertia_tensor: (3, 3) custom inertia tensor. - - Returns: - Tuple[np.ndarray, np.ndarray]: - - principal_axes: (3, 3) principal axes (rows). - - moment_of_inertia: (3,) principal moments sorted descending by - absolute value. - """ - return self.get_reproducible_axes(moment_of_inertia_tensor) - - def get_principal_axes(self, group, wrap: bool = False) -> np.ndarray: - """Compute the principal axes of an atom group from its moment of inertia. - - Args: - group: Atom group (or anything with ``.atoms``). - wrap: Whether to wrap atoms into the primary unit cell before computing - the moment of inertia. - - Returns: - np.ndarray: (3, 3) principal axes (rows), as given by - :meth:`get_reproducible_axes`. - """ - tensor = group.atoms.moment_of_inertia(wrap=wrap) - principal_axes, _ = self.get_reproducible_axes(tensor) - return principal_axes - - def get_reproducible_axes( - self, tensor: np.ndarray, rtol: float = 1e-5 + def get_principal_axes_from_tensor( + self, + moment_of_inertia_tensor: np.ndarray, + degeneracy_rtol: float = 100 * np.finfo(np.float32).eps, + reference_vector: Sequence[float] = (1.0, 2.0, 3.0), ) -> tuple[np.ndarray, np.ndarray]: - """Diagonalise a symmetric tensor into reproducible principal axes. + """Compute reproducible principal axes and moments from a MOI tensor. - ``np.linalg.eigh`` returns orthonormal axes, but the sign of each axis, and - the choice of axes within a set of (near-)equal moments, can differ between - LAPACK builds. These axes are used to average covariances over molecules and - frames, so that choice changes the entropy. This method fixes it: + ``np.linalg.eigh`` fixes neither the sign of each eigenvector nor the basis + within a degenerate eigenspace, and both can differ between LAPACK builds. + The axes define the frame covariances are averaged in, so this changes the + entropy. Both are therefore fixed here: - - Moments are sorted descending by absolute value. - - Axes whose moments are equal to within ``rtol`` (relative to the largest - moment) are re-chosen from the eigenvectors of a fixed reference tensor - projected onto the shared subspace. Axes with distinct moments are left as - they are. - - The first two axes are signed to point along the lab-frame direction - (1, 2, 3), and the third is their cross product, so the axes are - right-handed. + - Moments are sorted by descending absolute value. + - Within a degenerate eigenspace (moments equal to within + ``degeneracy_rtol`` of the largest), the basis is the eigenvectors of a + reference tensor built from ``reference_vector``, projected onto that + eigenspace. + - The first two axes are signed to have a positive projection onto + ``reference_vector``, and the third is their cross product. - The result is reproducible but is a function of the lab-frame orientation, - so it is not rotation covariant. + The reference is defined in the lab frame, so the result is reproducible + but not rotation covariant. Args: - tensor: (3, 3) symmetric tensor, e.g. a moment of inertia tensor. - rtol: Relative tolerance for treating two moments as equal. + moment_of_inertia_tensor: (3, 3) symmetric inertia tensor. + degeneracy_rtol: Relative tolerance, with respect to the largest + moment, for treating moments as degenerate. The default is a + multiple of the float32 precision of the coordinates. + reference_vector: Fixed direction used to choose axis signs and the + basis within a degenerate eigenspace. Its components must be + distinct, so that no symmetric or axis-aligned direction is + perpendicular to it or ties on its components. Returns: Tuple[np.ndarray, np.ndarray]: - principal_axes: (3, 3) principal axes (rows). - - moments: (3,) principal moments sorted descending by absolute - value. + - principal_moments: (3,) moments sorted by descending magnitude. """ - moments, vectors = np.linalg.eigh(tensor) - order = np.argsort(np.abs(moments))[::-1] - moments, vectors = moments[order], vectors[:, order] - - reference_direction = np.array([1.0, 2.0, 3.0]) - gaps = np.abs(np.diff(np.abs(moments))) - group_starts = np.flatnonzero(gaps > rtol * np.abs(moments[0])) + 1 - for group in np.split(np.arange(3), group_starts): - if len(group) > 1: - shared = vectors[:, group] - reference = shared.T @ np.diag(reference_direction) @ shared - _, rotation = np.linalg.eigh(reference) - vectors[:, group] = shared @ rotation - - for i in (0, 1): - if vectors[:, i] @ reference_direction < 0: - vectors[:, i] *= -1 - - third_axis = np.cross(vectors[:, 0], vectors[:, 1]) - principal_axes = np.array([vectors[:, 0], vectors[:, 1], third_axis]) - return principal_axes, moments + principal_moments, eigenvectors = np.linalg.eigh(moment_of_inertia_tensor) + order = np.argsort(np.abs(principal_moments))[::-1] + principal_moments = principal_moments[order] + eigenvectors = eigenvectors[:, order] + + reference = np.asarray(reference_vector, dtype=float) + gaps = np.abs(np.diff(np.abs(principal_moments))) + boundaries = ( + np.flatnonzero(gaps > degeneracy_rtol * np.abs(principal_moments[0])) + 1 + ) + for subspace in np.split(np.arange(3), boundaries): + if len(subspace) > 1: + basis = eigenvectors[:, subspace] + _, rotation = np.linalg.eigh(basis.T @ np.diag(reference) @ basis) + eigenvectors[:, subspace] = basis @ rotation + + for axis in (0, 1): + if eigenvectors[:, axis] @ reference < 0: + eigenvectors[:, axis] *= -1 + + z_axis = np.cross(eigenvectors[:, 0], eigenvectors[:, 1]) + principal_axes = np.array([eigenvectors[:, 0], eigenvectors[:, 1], z_axis]) + return principal_axes, principal_moments + + def get_principal_axes_from_group(self, group) -> np.ndarray: + """Return the reproducible principal axes (rows) of an atom group.""" + principal_axes, _ = self.get_principal_axes_from_tensor( + group.atoms.moment_of_inertia() + ) + return principal_axes def get_UA_masses(self, molecule) -> list[float]: """Return united-atom (UA) masses for a molecule. diff --git a/CodeEntropy/levels/nodes/covariance.py b/CodeEntropy/levels/nodes/covariance.py index 2fa5c2ee..63db3140 100644 --- a/CodeEntropy/levels/nodes/covariance.py +++ b/CodeEntropy/levels/nodes/covariance.py @@ -506,8 +506,8 @@ def _build_ua_vectors( # principal axes make_whole(residue.atoms) make_whole(bead) - trans_axes = axes_manager.get_principal_axes(residue.atoms) - rot_axes, moi = axes_manager.get_vanilla_axes(bead) + trans_axes = axes_manager.get_principal_axes_from_group(residue.atoms) + rot_axes, moi = axes_manager.get_molecule_axes(bead) center = bead.center_of_mass(unwrap=True) force_vecs.append( @@ -658,8 +658,8 @@ def _get_residue_axes( make_whole(mol.atoms) make_whole(bead) - trans_axes = axes_manager.get_principal_axes(mol.atoms) - rot_axes, moi = axes_manager.get_vanilla_axes(bead) + trans_axes = axes_manager.get_principal_axes_from_group(mol.atoms) + rot_axes, moi = axes_manager.get_molecule_axes(bead) center = bead.center_of_mass(unwrap=True) return ( np.asarray(trans_axes), @@ -688,8 +688,8 @@ def _get_polymer_axes( make_whole(mol.atoms) make_whole(bead) - trans_axes = axes_manager.get_principal_axes(mol.atoms) - rot_axes, moi = axes_manager.get_vanilla_axes(bead) + trans_axes = axes_manager.get_principal_axes_from_group(mol.atoms) + rot_axes, moi = axes_manager.get_molecule_axes(bead) center = bead.center_of_mass(unwrap=True) return ( diff --git a/tests/unit/CodeEntropy/levels/nodes/test_covariance_node.py b/tests/unit/CodeEntropy/levels/nodes/test_covariance_node.py index 96375714..38bd6ddd 100644 --- a/tests/unit/CodeEntropy/levels/nodes/test_covariance_node.py +++ b/tests/unit/CodeEntropy/levels/nodes/test_covariance_node.py @@ -494,14 +494,14 @@ def test_build_ua_vectors_uses_cached_axes_topology_when_available(): axes_manager.get_UA_axes.assert_not_called() -def test_build_ua_vectors_uses_vanilla_axes_when_not_customised(): +def test_build_ua_vectors_uses_molecule_axes_when_not_customised(): node = FrameCovarianceNode() axes_manager = MagicMock() - axes_manager.get_vanilla_axes.return_value = ( + axes_manager.get_molecule_axes.return_value = ( np.eye(3), np.array([1.0, 2.0, 3.0]), ) - axes_manager.get_principal_axes.return_value = np.eye(3) + axes_manager.get_principal_axes_from_group.return_value = np.eye(3) node._ft.get_weighted_forces = MagicMock(return_value=np.array([1.0, 0.0, 0.0])) node._ft.get_weighted_torques = MagicMock(return_value=np.array([0.0, 1.0, 0.0])) @@ -522,7 +522,7 @@ def test_build_ua_vectors_uses_vanilla_axes_when_not_customised(): ) assert make_whole.call_count == 2 - axes_manager.get_vanilla_axes.assert_called_once() + axes_manager.get_molecule_axes.assert_called_once() def test_build_residue_vectors_uses_residue_axes(): @@ -615,16 +615,16 @@ def test_get_residue_axes_customised_delegates_to_axes_manager(): ) -def test_get_residue_axes_vanilla_uses_make_whole_and_vanilla_axes(): +def test_get_residue_axes_molecule_uses_make_whole_and_molecule_axes(): node = FrameCovarianceNode() mol = FakeMolecule(n_residues=1) bead = FakeAtomGroup("res") axes_manager = MagicMock() - axes_manager.get_vanilla_axes.return_value = ( + axes_manager.get_molecule_axes.return_value = ( np.eye(3), np.array([1.0, 2.0, 3.0]), ) - axes_manager.get_principal_axes.return_value = np.eye(3) + axes_manager.get_principal_axes_from_group.return_value = np.eye(3) with patch("CodeEntropy.levels.nodes.covariance.make_whole") as make_whole: trans_axes, rot_axes, center, moi = node._get_residue_axes( @@ -647,16 +647,16 @@ def test_get_residue_axes_vanilla_uses_make_whole_and_vanilla_axes(): np.testing.assert_allclose(moi, np.array([1.0, 2.0, 3.0])) -def test_get_polymer_axes_uses_make_whole_and_vanilla_axes(): +def test_get_polymer_axes_uses_make_whole_and_molecule_axes(): node = FrameCovarianceNode() mol = FakeMolecule(n_residues=1) bead = FakeAtomGroup("poly") axes_manager = MagicMock() - axes_manager.get_vanilla_axes.return_value = ( + axes_manager.get_molecule_axes.return_value = ( np.eye(3), np.array([1.0, 2.0, 3.0]), ) - axes_manager.get_principal_axes.return_value = np.eye(3) + axes_manager.get_principal_axes_from_group.return_value = np.eye(3) with patch("CodeEntropy.levels.nodes.covariance.make_whole") as make_whole: trans_axes, rot_axes, center, moi = node._get_polymer_axes( diff --git a/tests/unit/CodeEntropy/levels/test_axes.py b/tests/unit/CodeEntropy/levels/test_axes.py index 0fdb9535..ba1d6c81 100644 --- a/tests/unit/CodeEntropy/levels/test_axes.py +++ b/tests/unit/CodeEntropy/levels/test_axes.py @@ -107,7 +107,7 @@ def _select_atoms(q): monkeypatch.setattr(ax, "get_moment_of_inertia_tensor", lambda **kwargs: np.eye(3)) monkeypatch.setattr( ax, - "get_custom_principal_axes", + "get_principal_axes_from_tensor", lambda moi: (np.eye(3), np.array([3.0, 2.0, 1.0])), ) @@ -225,23 +225,23 @@ def _sel(q): ax.get_UA_axes(u, index=5, res_position=None) -def test_get_custom_axes_degenerate_axis1_raises(): +def test_get_bonded_vector_axes_degenerate_axis1_raises(): ax = AxesCalculator() a = np.zeros(3) b_list = [np.zeros(3)] with pytest.raises(ValueError): - ax.get_custom_axes( + ax.get_bonded_vector_axes( a=a, b_list=b_list, c=np.zeros(3), dimensions=np.array([10.0, 10.0, 10.0]) ) -def test_get_custom_axes_normalizes_and_uses_bc_when_multiple_b(monkeypatch): +def test_get_bonded_vector_axes_normalizes_and_uses_bc_when_multiple_b(monkeypatch): ax = AxesCalculator() a = np.array([0.0, 0.0, 0.0]) b_list = [np.array([1.0, 0.0, 0.0]), np.array([1.0, 0.0, 0.0])] c = np.array([0.0, 1.0, 0.0]) - axes = ax.get_custom_axes( + axes = ax.get_bonded_vector_axes( a=a, b_list=b_list, c=c, dimensions=np.array([10.0, 10.0, 10.0]) ) assert axes.shape == (3, 3) @@ -291,10 +291,10 @@ def test_get_flipped_axes_flips_negative_dot(): assert np.allclose(flipped[0], np.array([1.0, 0.0, 0.0])) -def test_get_custom_principal_axes_returns_axes_and_moments(): +def test_get_principal_axes_from_tensor_returns_axes_and_moments(): ax = AxesCalculator() moi = np.eye(3) - axes, vals = ax.get_custom_principal_axes(moi) + axes, vals = ax.get_principal_axes_from_tensor(moi) assert axes.shape == (3, 3) assert vals.shape == (3,) @@ -321,18 +321,17 @@ def test_get_UA_masses_sums_bonded_hydrogens(): assert masses == [14.0] -def test_get_vanilla_axes_sorts_eigenvalues_desc_by_abs(monkeypatch): +def test_get_molecule_axes_sorts_eigenvalues_desc_by_abs(monkeypatch): ax = AxesCalculator() mol = MagicMock() moi_tensor = np.diag([1.0, -10.0, 3.0]) mol.moment_of_inertia.return_value = moi_tensor - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) mol.atoms = MagicMock() # avoid real MDAnalysis unwrap monkeypatch.setattr("CodeEntropy.levels.axes.make_whole", lambda _ag: None) - axes, moments = ax.get_vanilla_axes(mol) + axes, moments = ax.get_molecule_axes(mol) assert axes.shape == (3, 3) # sorted by abs descending => -10, 3, 1 @@ -344,7 +343,7 @@ def test_get_principal_axes_sorts_by_descending_eigenvalue(): group = MagicMock() group.atoms.moment_of_inertia.return_value = np.diag([1.0, 3.0, 2.0]) - axes = ax.get_principal_axes(group) + axes = ax.get_principal_axes_from_group(group) # eigenvalues 3, 2, 1 => rows along y, z, x (sign may differ) expected = np.array([[0, 1, 0], [0, 0, 1], [1, 0, 0]], dtype=float) @@ -359,7 +358,7 @@ def test_get_principal_axes_orthonormal_and_right_handed_for_near_degenerate(): group = MagicMock() group.atoms.moment_of_inertia.return_value = tensor - axes = ax.get_principal_axes(group) + axes = ax.get_principal_axes_from_group(group) assert np.allclose(axes @ axes.T, np.eye(3), atol=1e-12) assert np.isclose(np.linalg.det(axes), 1.0) @@ -399,11 +398,13 @@ def _example_tensors(): @pytest.mark.parametrize("name", list(_example_tensors())) -def test_get_reproducible_axes_orthonormal_right_handed_and_diagonalising(name): +def test_get_principal_axes_from_tensor_orthonormal_right_handed_and_diagonalising( + name, +): ax = AxesCalculator() tensor = _example_tensors()[name] - axes, moments = ax.get_reproducible_axes(tensor) + axes, moments = ax.get_principal_axes_from_tensor(tensor) assert np.allclose(axes @ axes.T, np.eye(3), atol=1e-12) assert np.isclose(np.linalg.det(axes), 1.0) @@ -412,64 +413,56 @@ def test_get_reproducible_axes_orthonormal_right_handed_and_diagonalising(name): @pytest.mark.parametrize("name", list(_example_tensors())) -def test_get_reproducible_axes_independent_of_eigensolver_choices(monkeypatch, name): +def test_get_principal_axes_from_tensor_independent_of_eigensolver_choices( + monkeypatch, name +): ax = AxesCalculator() tensor = _example_tensors()[name] - expected_axes, expected_moments = ax.get_reproducible_axes(tensor) + expected_axes, expected_moments = ax.get_principal_axes_from_tensor(tensor) for seed in range(20): monkeypatch.setattr(np.linalg, "eigh", _scrambled_eigh(seed)) - axes, moments = ax.get_reproducible_axes(tensor) + axes, moments = ax.get_principal_axes_from_tensor(tensor) assert np.allclose(axes, expected_axes, atol=1e-9) assert np.allclose(moments, expected_moments) @pytest.mark.parametrize("name", list(_example_tensors())) -def test_get_reproducible_axes_stable_under_rounding_level_noise(name): +def test_get_principal_axes_from_tensor_stable_under_rounding_level_noise(name): ax = AxesCalculator() tensor = _example_tensors()[name] - expected_axes, _ = ax.get_reproducible_axes(tensor) + expected_axes, _ = ax.get_principal_axes_from_tensor(tensor) rng = np.random.default_rng(2) for _ in range(50): noise = rng.normal(scale=1e-7, size=(3, 3)) - axes, _ = ax.get_reproducible_axes(tensor + (noise + noise.T) / 2) + axes, _ = ax.get_principal_axes_from_tensor(tensor + (noise + noise.T) / 2) assert np.allclose(axes, expected_axes, atol=1e-4) -def test_get_reproducible_axes_keeps_unique_axis_of_linear_tensor_exact(): +def test_get_principal_axes_from_tensor_keeps_unique_axis_of_linear_tensor_exact(): ax = AxesCalculator() direction = np.array([1.0, -2.0, 0.5]) direction /= np.linalg.norm(direction) tensor = 4.0 * (np.eye(3) - np.outer(direction, direction)) - axes, moments = ax.get_reproducible_axes(tensor) + axes, moments = ax.get_principal_axes_from_tensor(tensor) assert np.isclose(moments[2], 0.0, atol=1e-12) assert np.isclose(abs(axes[2] @ direction), 1.0, atol=1e-12) -def test_get_reproducible_axes_signs_first_two_axes_along_reference_direction(): +def test_get_principal_axes_from_tensor_signs_first_two_axes_along_reference(): ax = AxesCalculator() tensor = np.diag([5.0, 3.0, 1.0]) - axes, _ = ax.get_reproducible_axes(tensor) + axes, _ = ax.get_principal_axes_from_tensor(tensor) assert axes[0] @ np.array([1.0, 2.0, 3.0]) > 0 assert axes[1] @ np.array([1.0, 2.0, 3.0]) > 0 -def test_get_principal_axes_passes_wrap_to_moment_of_inertia(): - ax = AxesCalculator() - group = MagicMock() - group.atoms.moment_of_inertia.return_value = np.diag([3.0, 2.0, 1.0]) - - ax.get_principal_axes(group, wrap=True) - - group.atoms.moment_of_inertia.assert_called_once_with(wrap=True) - - -def test_get_vanilla_axes_moments_ignore_position_relative_to_box(): +def test_get_molecule_axes_moments_ignore_position_relative_to_box(): """Shifting a molecule by a box vector must not change its moments.""" universe = mda.Universe.empty( n_atoms=3, n_residues=1, atom_resindex=[0, 0, 0], trajectory=True @@ -481,9 +474,9 @@ def test_get_vanilla_axes_moments_ignore_position_relative_to_box(): ax = AxesCalculator() universe.atoms.positions = positions + 25.0 - _, moments = ax.get_vanilla_axes(universe.atoms) + _, moments = ax.get_molecule_axes(universe.atoms) universe.atoms.positions = positions + 25.0 + np.array([50.0, 0.0, 0.0]) - _, shifted_moments = ax.get_vanilla_axes(universe.atoms) + _, shifted_moments = ax.get_molecule_axes(universe.atoms) assert np.allclose(shifted_moments, moments, rtol=1e-3) assert moments.max() < 10.0 @@ -521,7 +514,7 @@ def test_get_bonded_axes_non_heavy_returns_none(): assert out_moi is None -def test_get_bonded_axes_case1_uses_vanilla_axes_and_returns_flipped(monkeypatch): +def test_get_bonded_axes_case1_uses_molecule_axes_and_returns_flipped(monkeypatch): ax = AxesCalculator() system = MagicMock() atom = _atom(index=1, mass=12.0, pos=(1, 0, 0)) @@ -531,7 +524,7 @@ def test_get_bonded_axes_case1_uses_vanilla_axes_and_returns_flipped(monkeypatch monkeypatch.setattr(ax, "find_bonded_atoms", lambda _idx, _sys: (heavy, hyd)) monkeypatch.setattr( - ax, "get_vanilla_axes", lambda _ag: (np.eye(3) * 7, np.array([1.0, 2.0, 3.0])) + ax, "get_molecule_axes", lambda _ag: (np.eye(3) * 7, np.array([1.0, 2.0, 3.0])) ) monkeypatch.setattr(ax, "get_flipped_axes", lambda ua, axes, com, dims: axes * -1) @@ -541,7 +534,7 @@ def test_get_bonded_axes_case1_uses_vanilla_axes_and_returns_flipped(monkeypatch assert np.allclose(out_moi, np.array([1.0, 2.0, 3.0])) -def test_get_bonded_axes_case2_one_heavy_no_h_calls_get_custom_axes_and_custom_moi( +def test_get_bonded_axes_case2_one_heavy_no_h_calls_bonded_vector_axes_and_custom_moi( monkeypatch, ): ax = AxesCalculator() @@ -554,7 +547,7 @@ def test_get_bonded_axes_case2_one_heavy_no_h_calls_get_custom_axes_and_custom_m hyd = _FakeAtomGroup([]) monkeypatch.setattr(ax, "find_bonded_atoms", lambda _idx, _sys: (heavy, hyd)) - monkeypatch.setattr(ax, "get_custom_axes", lambda **kwargs: np.eye(3)) + monkeypatch.setattr(ax, "get_bonded_vector_axes", lambda **kwargs: np.eye(3)) monkeypatch.setattr( ax, "get_custom_moment_of_inertia", lambda **kwargs: np.array([9.0, 8.0, 7.0]) ) @@ -566,7 +559,9 @@ def test_get_bonded_axes_case2_one_heavy_no_h_calls_get_custom_axes_and_custom_m assert np.allclose(out_moi, np.array([9.0, 8.0, 7.0])) -def test_get_bonded_axes_case3_one_heavy_with_h_calls_get_custom_axes(monkeypatch): +def test_get_bonded_axes_case3_one_heavy_with_h_calls_get_bonded_vector_axes( + monkeypatch, +): ax = AxesCalculator() system = MagicMock() atom = _atom(index=1, mass=12.0, pos=(0, 0, 0)) @@ -583,7 +578,7 @@ def _custom_axes(**kwargs): called["n"] += 1 return np.eye(3) * 2 - monkeypatch.setattr(ax, "get_custom_axes", _custom_axes) + monkeypatch.setattr(ax, "get_bonded_vector_axes", _custom_axes) monkeypatch.setattr( ax, "get_custom_moment_of_inertia", lambda **kwargs: np.array([1.0, 1.0, 1.0]) ) @@ -596,7 +591,7 @@ def _custom_axes(**kwargs): assert np.allclose(out_moi, np.array([1.0, 1.0, 1.0])) -def test_get_bonded_axes_case5_two_heavy_calls_get_custom_axes(monkeypatch): +def test_get_bonded_axes_case5_two_heavy_calls_get_bonded_vector_axes(monkeypatch): ax = AxesCalculator() system = MagicMock() atom = _atom(index=1, mass=12.0, pos=(0, 0, 0)) @@ -610,7 +605,7 @@ def test_get_bonded_axes_case5_two_heavy_calls_get_custom_axes(monkeypatch): hyd = _FakeAtomGroup([]) monkeypatch.setattr(ax, "find_bonded_atoms", lambda _idx, _sys: (heavy, hyd)) - monkeypatch.setattr(ax, "get_custom_axes", lambda **kwargs: np.eye(3) * 3) + monkeypatch.setattr(ax, "get_bonded_vector_axes", lambda **kwargs: np.eye(3) * 3) monkeypatch.setattr( ax, "get_custom_moment_of_inertia", lambda **kwargs: np.array([2.0, 2.0, 2.0]) ) @@ -647,7 +642,7 @@ def _select_atoms(q): monkeypatch.setattr(ax, "get_moment_of_inertia_tensor", lambda **kwargs: np.eye(3)) monkeypatch.setattr( ax, - "get_custom_principal_axes", + "get_principal_axes_from_tensor", lambda moi: (np.eye(3), np.array([3.0, 2.0, 1.0])), ) @@ -705,17 +700,17 @@ def test_get_vector_wraps_periodic_boundaries(): np.testing.assert_allclose(out, np.array([2.0, 0.0, 0.0])) -def test_get_custom_axes_raises_when_axis1_degenerate(): +def test_get_bonded_vector_axes_raises_when_axis1_degenerate(): ac = AxesCalculator() a = np.zeros(3) b_list = [np.zeros(3), np.zeros(3)] c = np.ones(3) dims = np.array([10.0, 10.0, 10.0]) with pytest.raises(ValueError): - ac.get_custom_axes(a=a, b_list=b_list, c=c, dimensions=dims) + ac.get_bonded_vector_axes(a=a, b_list=b_list, c=c, dimensions=dims) -def test_get_custom_axes_raises_when_normalization_degenerate(): +def test_get_bonded_vector_axes_raises_when_normalization_degenerate(): ac = AxesCalculator() dims = np.array([10.0, 10.0, 10.0]) @@ -724,14 +719,14 @@ def test_get_custom_axes_raises_when_normalization_degenerate(): c = np.array([2.0, 0.0, 0.0]) with pytest.raises(ValueError): - ac.get_custom_axes(a=a, b_list=b_list, c=c, dimensions=dims) + ac.get_bonded_vector_axes(a=a, b_list=b_list, c=c, dimensions=dims) -def test_get_custom_principal_axes_is_right_handed(): +def test_get_principal_axes_from_tensor_is_right_handed(): ac = AxesCalculator() moi = np.diag([3.0, 2.0, 1.0]) - axes, vals = ac.get_custom_principal_axes(moi) + axes, vals = ac.get_principal_axes_from_tensor(moi) assert axes.shape == (3, 3) assert vals.shape == (3,) @@ -773,7 +768,9 @@ def test_get_custom_moment_of_inertia_len2_zeros_smallest_component(): def test_get_UA_axes_multiple_heavy_atoms_uses_custom_principal_axes(monkeypatch): ax = AxesCalculator() - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) + monkeypatch.setattr( + ax, "get_principal_axes_from_group", lambda *_a, **_k: np.eye(3) + ) heavy_atoms = _FakeAtomGroup( [ @@ -850,7 +847,7 @@ def test_get_bonded_axes_returns_none_none_if_custom_axes_none(monkeypatch): ax, "find_bonded_atoms", lambda _idx, _sys: (heavy_bonded, light_bonded) ) - monkeypatch.setattr(ax, "get_custom_axes", lambda **kwargs: None) + monkeypatch.setattr(ax, "get_bonded_vector_axes", lambda **kwargs: None) custom_axes, moi = ax.get_bonded_axes( system=system, atom=atom, dimensions=dimensions @@ -944,7 +941,7 @@ def test_get_residue_axes_from_topology_no_neighbor_bonds_uses_cached_indices( get_principal = MagicMock(return_value=(np.eye(3) * 2.0, np.array([3.0, 2.0, 1.0]))) monkeypatch.setattr(ax, "get_moment_of_inertia_tensor", get_tensor) - monkeypatch.setattr(ax, "get_custom_principal_axes", get_principal) + monkeypatch.setattr(ax, "get_principal_axes_from_tensor", get_principal) box = np.array([20.0, 30.0, 40.0]) trans_axes, rot_axes, center, moi = ax.get_residue_axes_from_topology( @@ -974,7 +971,7 @@ def test_get_residue_axes_from_topology_no_neighbor_bonds_uses_cached_indices( get_principal.assert_called_once() -def test_get_residue_axes_from_topology_neighbor_bonds_uses_vanilla_axes( +def test_get_residue_axes_from_topology_neighbor_bonds_uses_molecule_axes( monkeypatch, ): ax = AxesCalculator() @@ -985,16 +982,16 @@ def test_get_residue_axes_from_topology_neighbor_bonds_uses_vanilla_axes( ) mol = MagicMock() get_principal = MagicMock(return_value=np.eye(3) * 5.0) - monkeypatch.setattr(ax, "get_principal_axes", get_principal) + monkeypatch.setattr(ax, "get_principal_axes_from_group", get_principal) residue_atoms = MagicMock() residue_atoms.center_of_mass.return_value = np.array([1.0, 2.0, 3.0]) topology = _residue_topology(has_neighbor_bonds=True) make_whole = MagicMock() - get_vanilla = MagicMock(return_value=(np.eye(3) * 6.0, np.array([6.0, 5.0, 4.0]))) + get_molecule = MagicMock(return_value=(np.eye(3) * 6.0, np.array([6.0, 5.0, 4.0]))) monkeypatch.setattr("CodeEntropy.levels.axes.make_whole", make_whole) - monkeypatch.setattr(ax, "get_vanilla_axes", get_vanilla) + monkeypatch.setattr(ax, "get_molecule_axes", get_molecule) trans_axes, rot_axes, center, moi = ax.get_residue_axes_from_topology( u=universe, @@ -1006,7 +1003,7 @@ def test_get_residue_axes_from_topology_neighbor_bonds_uses_vanilla_axes( make_whole.assert_called_once_with(mol.atoms) get_principal.assert_called_once() - get_vanilla.assert_called_once_with(residue_atoms) + get_molecule.assert_called_once_with(residue_atoms) np.testing.assert_allclose(trans_axes, np.eye(3) * 5.0) np.testing.assert_allclose(rot_axes, np.eye(3) * 6.0) np.testing.assert_allclose(center, np.array([1.0, 2.0, 3.0])) @@ -1035,7 +1032,7 @@ def test_get_UA_axes_from_topology_multiple_heavy_uses_cached_indices_and_box( get_bonded = MagicMock(return_value=(np.eye(3) * 4.0, np.array([1.0, 1.0, 1.0]))) monkeypatch.setattr(ax, "get_moment_of_inertia_tensor", get_tensor) - monkeypatch.setattr(ax, "get_custom_principal_axes", get_principal) + monkeypatch.setattr(ax, "get_principal_axes_from_tensor", get_principal) monkeypatch.setattr(ax, "get_bonded_axes_from_topology", get_bonded) box = np.array([20.0, 30.0, 40.0]) @@ -1083,7 +1080,7 @@ def test_get_UA_axes_from_topology_single_heavy_uses_residue_principal_axes( ) residue_atoms = MagicMock() get_principal = MagicMock(return_value=np.eye(3) * 5.0) - monkeypatch.setattr(ax, "get_principal_axes", get_principal) + monkeypatch.setattr(ax, "get_principal_axes_from_group", get_principal) topology = _ua_topology(heavy_atom_index=1, residue_heavy_indices=(1,)) @@ -1119,7 +1116,9 @@ def test_get_UA_axes_from_topology_raises_when_cached_bonded_axes_fail(monkeypat heavy_atom = _FakeAtom(1, 12.0, [1.0, 0.0, 0.0]) universe = _FakeUniverse({1: heavy_atom}) residue_atoms = MagicMock() - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) + monkeypatch.setattr( + ax, "get_principal_axes_from_group", lambda *_a, **_k: np.eye(3) + ) topology = _ua_topology(heavy_atom_index=1, residue_heavy_indices=(1,)) monkeypatch.setattr("CodeEntropy.levels.axes.make_whole", lambda _ag: None) @@ -1151,7 +1150,7 @@ def test_get_bonded_axes_from_topology_non_heavy_returns_none_none(): assert moi is None -def test_get_bonded_axes_from_topology_no_bonded_heavy_uses_vanilla_axes( +def test_get_bonded_axes_from_topology_no_bonded_heavy_uses_molecule_axes( monkeypatch, ): ax = AxesCalculator() @@ -1167,11 +1166,11 @@ def test_get_bonded_axes_from_topology_no_bonded_heavy_uses_vanilla_axes( bonded_light_indices=(2,), ) - get_vanilla = MagicMock(return_value=(np.eye(3) * 7.0, np.array([7.0, 8.0, 9.0]))) + get_molecule = MagicMock(return_value=(np.eye(3) * 7.0, np.array([7.0, 8.0, 9.0]))) get_custom_moi = MagicMock() get_flipped = MagicMock(return_value=np.eye(3) * -7.0) - monkeypatch.setattr(ax, "get_vanilla_axes", get_vanilla) + monkeypatch.setattr(ax, "get_molecule_axes", get_molecule) monkeypatch.setattr(ax, "get_custom_moment_of_inertia", get_custom_moi) monkeypatch.setattr(ax, "get_flipped_axes", get_flipped) @@ -1184,7 +1183,7 @@ def test_get_bonded_axes_from_topology_no_bonded_heavy_uses_vanilla_axes( np.testing.assert_allclose(custom_axes, np.eye(3) * -7.0) np.testing.assert_allclose(moi, np.array([7.0, 8.0, 9.0])) - get_vanilla.assert_called_once() + get_molecule.assert_called_once() get_custom_moi.assert_not_called() get_flipped.assert_called_once() @@ -1205,11 +1204,11 @@ def test_get_bonded_axes_from_topology_one_heavy_no_light_uses_custom_axes( bonded_light_indices=(), ) - get_custom_axes = MagicMock(return_value=np.eye(3) * 2.0) + get_bonded_vector_axes = MagicMock(return_value=np.eye(3) * 2.0) get_custom_moi = MagicMock(return_value=np.array([2.0, 3.0, 4.0])) get_flipped = MagicMock(return_value=np.eye(3) * 3.0) - monkeypatch.setattr(ax, "get_custom_axes", get_custom_axes) + monkeypatch.setattr(ax, "get_bonded_vector_axes", get_bonded_vector_axes) monkeypatch.setattr(ax, "get_custom_moment_of_inertia", get_custom_moi) monkeypatch.setattr(ax, "get_flipped_axes", get_flipped) @@ -1223,7 +1222,7 @@ def test_get_bonded_axes_from_topology_one_heavy_no_light_uses_custom_axes( np.testing.assert_allclose(custom_axes, np.eye(3) * 3.0) np.testing.assert_allclose(moi, np.array([2.0, 3.0, 4.0])) - kwargs = get_custom_axes.call_args.kwargs + kwargs = get_bonded_vector_axes.call_args.kwargs np.testing.assert_allclose(kwargs["a"], heavy_atom.position) np.testing.assert_allclose(kwargs["b_list"][0], bonded_heavy.position) np.testing.assert_allclose(kwargs["c"], np.zeros(3)) @@ -1248,8 +1247,8 @@ def test_get_bonded_axes_from_topology_one_heavy_with_light_uses_light_as_c( bonded_light_indices=(2,), ) - get_custom_axes = MagicMock(return_value=np.eye(3)) - monkeypatch.setattr(ax, "get_custom_axes", get_custom_axes) + get_bonded_vector_axes = MagicMock(return_value=np.eye(3)) + monkeypatch.setattr(ax, "get_bonded_vector_axes", get_bonded_vector_axes) monkeypatch.setattr( ax, "get_custom_moment_of_inertia", @@ -1267,7 +1266,7 @@ def test_get_bonded_axes_from_topology_one_heavy_with_light_uses_light_as_c( np.testing.assert_allclose(custom_axes, np.eye(3)) np.testing.assert_allclose(moi, np.array([1.0, 2.0, 3.0])) np.testing.assert_allclose( - get_custom_axes.call_args.kwargs["c"], bonded_light.position + get_bonded_vector_axes.call_args.kwargs["c"], bonded_light.position ) @@ -1294,8 +1293,8 @@ def test_get_bonded_axes_from_topology_two_heavy_uses_heavy_positions_as_b_list( bonded_light_indices=(), ) - get_custom_axes = MagicMock(return_value=np.eye(3) * 4.0) - monkeypatch.setattr(ax, "get_custom_axes", get_custom_axes) + get_bonded_vector_axes = MagicMock(return_value=np.eye(3) * 4.0) + monkeypatch.setattr(ax, "get_bonded_vector_axes", get_bonded_vector_axes) monkeypatch.setattr( ax, "get_custom_moment_of_inertia", @@ -1313,11 +1312,11 @@ def test_get_bonded_axes_from_topology_two_heavy_uses_heavy_positions_as_b_list( np.testing.assert_allclose(custom_axes, np.eye(3) * 4.0) np.testing.assert_allclose(moi, np.array([4.0, 5.0, 6.0])) np.testing.assert_allclose( - get_custom_axes.call_args.kwargs["b_list"], + get_bonded_vector_axes.call_args.kwargs["b_list"], np.array([[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]), ) np.testing.assert_allclose( - get_custom_axes.call_args.kwargs["c"], + get_bonded_vector_axes.call_args.kwargs["c"], bonded_heavy_1.position, ) @@ -1341,7 +1340,7 @@ def test_get_bonded_axes_from_topology_returns_none_when_custom_axes_none( get_custom_moi = MagicMock() get_flipped = MagicMock() - monkeypatch.setattr(ax, "get_custom_axes", lambda **kwargs: None) + monkeypatch.setattr(ax, "get_bonded_vector_axes", lambda **kwargs: None) monkeypatch.setattr(ax, "get_custom_moment_of_inertia", get_custom_moi) monkeypatch.setattr(ax, "get_flipped_axes", get_flipped) @@ -1429,7 +1428,9 @@ def _select_atoms(q): return edge_atom_set u.atoms.select_atoms.side_effect = _select_atoms - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) + monkeypatch.setattr( + ax, "get_principal_axes_from_group", lambda *_a, **_k: np.eye(3) + ) monkeypatch.setattr(ax, "get_chain", lambda residue, first, last: [backbone_atom]) monkeypatch.setattr( ax, @@ -1475,7 +1476,9 @@ def _select_atoms(q): return edge_atom_set u.atoms.select_atoms.side_effect = _select_atoms - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) + monkeypatch.setattr( + ax, "get_principal_axes_from_group", lambda *_a, **_k: np.eye(3) + ) monkeypatch.setattr( ax, "get_chain", lambda residue, edge_atom_1, edge_atom_2: backbone_atoms ) @@ -1523,7 +1526,9 @@ def _select_atoms(q): if q.startswith("resindex 0 and (bonded resindex"): return [uas[2]] - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) + monkeypatch.setattr( + ax, "get_principal_axes_from_group", lambda *_a, **_k: np.eye(3) + ) u.atoms.select_atoms.side_effect = _select_atoms residue.select_atoms.side_effect = _select_atoms residue.atoms.select_atoms.side_effect = _select_atoms @@ -1843,7 +1848,7 @@ def _select_atoms(q): ) monkeypatch.setattr( - ax, "get_custom_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) + ax, "get_bonded_vector_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) ) trans_axes, rot_axes, rot_center, moi = ax.get_UA_axes( @@ -1885,7 +1890,7 @@ def _select_atoms(q): lambda system, atom, dimensions: (np.eye(3), 3 * np.eye(3)), ) monkeypatch.setattr( - ax, "get_custom_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) + ax, "get_bonded_vector_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) ) monkeypatch.setattr(ax, "get_chain", lambda residue, first, last: []) trans_axes, rot_axes, rot_center, moi = ax.get_UA_axes( @@ -1905,7 +1910,9 @@ def test_get_residue_axes_non_terminal_2_atoms(monkeypatch): monkeypatch.setattr("CodeEntropy.levels.axes.make_whole", lambda _ag: None) residue = u.select_atoms("resindex 5") residue.__len__.return_value = 2 - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) + monkeypatch.setattr( + ax, "get_principal_axes_from_group", lambda *_a, **_k: np.eye(3) + ) uas = _FakeAtomGroup( [ _atom(index=0, mass=12.0, pos=(1, 1, 1)), @@ -1923,7 +1930,7 @@ def _select_atoms(q): residue.select_atoms.side_effect = residue monkeypatch.setattr(ax, "get_chain", lambda residue, first, last: []) monkeypatch.setattr( - ax, "get_custom_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) + ax, "get_bonded_vector_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) ) monkeypatch.setattr( ax, @@ -1959,7 +1966,9 @@ def test_get_residue_axes_terminal_2_atoms(monkeypatch): _atom(index=2, mass=12.0, pos=(0, 0, 1)), ], ) - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) + monkeypatch.setattr( + ax, "get_principal_axes_from_group", lambda *_a, **_k: np.eye(3) + ) def _select_atoms(q): if q == "mass 2 to 999": @@ -1974,7 +1983,7 @@ def _select_atoms(q): residue.select_atoms.side_effect = _select_atoms residue.atoms.select_atoms.side_effect = _select_atoms monkeypatch.setattr( - ax, "get_custom_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) + ax, "get_bonded_vector_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) ) monkeypatch.setattr( ax, @@ -2006,7 +2015,9 @@ def test_get_res_axes_terminal_1_atom(monkeypatch): _atom(index=0, mass=12.0, pos=(1, 0, 0)), ], ) - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) + monkeypatch.setattr( + ax, "get_principal_axes_from_group", lambda *_a, **_k: np.eye(3) + ) def _select_atoms(q): if q == "mass 2 to 999": @@ -2075,7 +2086,9 @@ def _select_atoms_residue(q): "get_bonded_axes", lambda system, atom, dimensions: (np.eye(3), 3 * np.eye(3)), ) - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: 2 * np.eye(3)) + monkeypatch.setattr( + ax, "get_principal_axes_from_group", lambda *_a, **_k: 2 * np.eye(3) + ) trans_axes, rot_axes, rot_center, moi = ax.get_UA_axes( data_container=residue_group, index=0, res_position=-1 @@ -2104,7 +2117,9 @@ def _select_atoms(q): return [] residue.atoms.select_atoms.side_effect = _select_atoms - monkeypatch.setattr(ax, "get_principal_axes", lambda *_a, **_k: np.eye(3)) + monkeypatch.setattr( + ax, "get_principal_axes_from_group", lambda *_a, **_k: np.eye(3) + ) centre, axes = ax.get_terminal_axes( residue, heavy_atoms[0], dimensions=np.array([1, 1, 1]) ) @@ -2131,7 +2146,7 @@ def _select_atoms(q): residue.atoms.select_atoms.side_effect = _select_atoms monkeypatch.setattr( - ax, "get_custom_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) + ax, "get_bonded_vector_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) ) centre, axes = ax.get_terminal_axes( residue, heavy_atoms[0], dimensions=np.array([1, 1, 1]) @@ -2184,7 +2199,7 @@ def test_get_non_terminal_axes_2points(monkeypatch): ) monkeypatch.setattr(ax, "get_chain", lambda residue, first, last: []) monkeypatch.setattr( - ax, "get_custom_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) + ax, "get_bonded_vector_axes", lambda a, b_list, c, dimensions: 2 * np.eye(3) ) centre, axes = ax.get_non_terminal_axes( residue=residue, edges=heavy_atoms, dimensions=np.array([1, 1, 1]) From 0743974bb9f2a73ef70b309ce165a76d5c7d0d73 Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Thu, 8 Oct 2026 14:30:06 +0100 Subject: [PATCH 11/12] tests(regression): update all baseline regression results with `eigh` --- .../baselines/benzaldehyde/default.json | 10 +++++----- tests/regression/baselines/benzaldehyde/rad.json | 10 +++++----- tests/regression/baselines/benzene/default.json | 10 +++++----- tests/regression/baselines/benzene/rad.json | 10 +++++----- .../baselines/cyclohexane/default.json | 10 +++++----- tests/regression/baselines/cyclohexane/rad.json | 10 +++++----- tests/regression/baselines/dna/default.json | 16 ++++++++-------- .../baselines/ethyl-acetate/default.json | 10 +++++----- .../regression/baselines/ethyl-acetate/rad.json | 10 +++++----- tests/regression/baselines/methane/default.json | 6 +++--- tests/regression/baselines/methane/rad.json | 6 +++--- tests/regression/baselines/methanol/default.json | 8 ++++---- tests/regression/baselines/methanol/rad.json | 8 ++++---- tests/regression/baselines/octonol/default.json | 10 +++++----- tests/regression/baselines/octonol/rad.json | 10 +++++----- tests/regression/baselines/water/default.json | 6 +++--- tests/regression/baselines/water/rad.json | 6 +++--- 17 files changed, 78 insertions(+), 78 deletions(-) diff --git a/tests/regression/baselines/benzaldehyde/default.json b/tests/regression/baselines/benzaldehyde/default.json index c99a2d15..8e235d50 100644 --- a/tests/regression/baselines/benzaldehyde/default.json +++ b/tests/regression/baselines/benzaldehyde/default.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 24.88518233240474, - "united_atom:Rovibrational": 27.950376507672583, - "residue:FTmat-Transvibrational": 71.03412922724692, - "residue:FTmat-Rovibrational": 59.44169664956799, + "united_atom:Transvibrational": 24.921822103314035, + "united_atom:Rovibrational": 27.950376507672594, + "residue:FTmat-Transvibrational": 70.97090266225699, + "residue:FTmat-Rovibrational": 59.588669973122094, "united_atom:Conformational": 7.522643899702263, "residue:Conformational": 0.0, "residue:Orientational": 59.43920971558428 }, - "total": 250.27323833217878 + "total": 250.39362486165226 } } } diff --git a/tests/regression/baselines/benzaldehyde/rad.json b/tests/regression/baselines/benzaldehyde/rad.json index 8e39e21b..df3c0f93 100644 --- a/tests/regression/baselines/benzaldehyde/rad.json +++ b/tests/regression/baselines/benzaldehyde/rad.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 24.88518233240474, - "united_atom:Rovibrational": 27.950376507672583, - "residue:FTmat-Transvibrational": 71.03412922724692, - "residue:FTmat-Rovibrational": 59.44169664956799, + "united_atom:Transvibrational": 24.921822103314035, + "united_atom:Rovibrational": 27.950376507672594, + "residue:FTmat-Transvibrational": 70.97090266225699, + "residue:FTmat-Rovibrational": 59.588669973122094, "united_atom:Conformational": 7.522643899702263, "residue:Conformational": 0.0, "residue:Orientational": 25.502722133228936 }, - "total": 216.33675074982344 + "total": 216.45713727929692 } } } diff --git a/tests/regression/baselines/benzene/default.json b/tests/regression/baselines/benzene/default.json index 86ae25d0..43ffe96e 100644 --- a/tests/regression/baselines/benzene/default.json +++ b/tests/regression/baselines/benzene/default.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 9.081853431559052, - "united_atom:Rovibrational": 27.534380126250227, - "residue:FTmat-Transvibrational": 72.66211800013413, - "residue:FTmat-Rovibrational": 59.93761874375924, + "united_atom:Transvibrational": 9.070682016770112, + "united_atom:Rovibrational": 27.534380126250213, + "residue:FTmat-Transvibrational": 72.69407639869898, + "residue:FTmat-Rovibrational": 59.84501427492272, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 41.58427729275938 }, - "total": 210.800247594462 + "total": 210.72843010940142 } } } diff --git a/tests/regression/baselines/benzene/rad.json b/tests/regression/baselines/benzene/rad.json index c4aca55f..4e344234 100644 --- a/tests/regression/baselines/benzene/rad.json +++ b/tests/regression/baselines/benzene/rad.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 9.081853431559052, - "united_atom:Rovibrational": 27.534380126250227, - "residue:FTmat-Transvibrational": 72.66211800013413, - "residue:FTmat-Rovibrational": 59.93761874375924, + "united_atom:Transvibrational": 9.070682016770112, + "united_atom:Rovibrational": 27.534380126250213, + "residue:FTmat-Transvibrational": 72.69407639869898, + "residue:FTmat-Rovibrational": 59.84501427492272, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 12.386543820026672 }, - "total": 181.6025141217293 + "total": 181.5306966366687 } } } diff --git a/tests/regression/baselines/cyclohexane/default.json b/tests/regression/baselines/cyclohexane/default.json index c0233178..cde7c000 100644 --- a/tests/regression/baselines/cyclohexane/default.json +++ b/tests/regression/baselines/cyclohexane/default.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 11.726471858700231, - "united_atom:Rovibrational": 47.71088602161552, - "residue:FTmat-Transvibrational": 70.3922327806972, - "residue:FTmat-Rovibrational": 63.44920824648768, + "united_atom:Transvibrational": 11.686244565629414, + "united_atom:Rovibrational": 47.71088602161551, + "residue:FTmat-Transvibrational": 70.47299498069259, + "residue:FTmat-Rovibrational": 63.342990839070794, "united_atom:Conformational": 1.288879206695518, "residue:Conformational": 0.0, "residue:Orientational": 47.54362774624537 }, - "total": 242.11130586044152 + "total": 242.04562335994922 } } } diff --git a/tests/regression/baselines/cyclohexane/rad.json b/tests/regression/baselines/cyclohexane/rad.json index f65d9a4c..f901bd9a 100644 --- a/tests/regression/baselines/cyclohexane/rad.json +++ b/tests/regression/baselines/cyclohexane/rad.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 11.726471858700231, - "united_atom:Rovibrational": 47.71088602161552, - "residue:FTmat-Transvibrational": 70.3922327806972, - "residue:FTmat-Rovibrational": 63.44920824648768, + "united_atom:Transvibrational": 11.686244565629414, + "united_atom:Rovibrational": 47.71088602161551, + "residue:FTmat-Transvibrational": 70.47299498069259, + "residue:FTmat-Rovibrational": 63.342990839070794, "united_atom:Conformational": 1.288879206695518, "residue:Conformational": 0.0, "residue:Orientational": 14.049324060636614 }, - "total": 208.61700217483278 + "total": 208.55131967434048 } } } diff --git a/tests/regression/baselines/dna/default.json b/tests/regression/baselines/dna/default.json index 2cbef740..b5d797f1 100644 --- a/tests/regression/baselines/dna/default.json +++ b/tests/regression/baselines/dna/default.json @@ -3,30 +3,30 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.002160679012128457, + "united_atom:Rovibrational": 0.0021606790121284584, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 3.376800684085249, - "polymer:FTmat-Transvibrational": 12.341104347192612, + "residue:Rovibrational": 3.376800684085247, + "polymer:FTmat-Transvibrational": 12.341104347192614, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 20.478971046917703 + "total": 20.4789710469177 }, "1": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 0.01846427765949586, + "united_atom:Rovibrational": 0.01846427765949588, "residue:Transvibrational": 0.0, - "residue:Rovibrational": 2.3863201082544565, - "polymer:FTmat-Transvibrational": 11.11037253388596, + "residue:Rovibrational": 2.386320108254459, + "polymer:FTmat-Transvibrational": 11.110372533885974, "polymer:FTmat-Rovibrational": 0.0, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "polymer:Orientational": 4.758905336627712 }, - "total": 18.274062256427623 + "total": 18.27406225642764 } } } diff --git a/tests/regression/baselines/ethyl-acetate/default.json b/tests/regression/baselines/ethyl-acetate/default.json index 077cdbe3..681c02cb 100644 --- a/tests/regression/baselines/ethyl-acetate/default.json +++ b/tests/regression/baselines/ethyl-acetate/default.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 19.703248485425714, - "united_atom:Rovibrational": 49.35007067210558, - "residue:FTmat-Transvibrational": 67.91350627765567, - "residue:FTmat-Rovibrational": 60.042233035077246, + "united_atom:Transvibrational": 19.80599222598891, + "united_atom:Rovibrational": 49.35007067210563, + "residue:FTmat-Transvibrational": 68.04837872217398, + "residue:FTmat-Rovibrational": 59.99054731669011, "united_atom:Conformational": 8.175537881068413, "residue:Conformational": 0.0, "residue:Orientational": 65.33877737416202 }, - "total": 270.52337372549465 + "total": 270.70930419218905 } } } diff --git a/tests/regression/baselines/ethyl-acetate/rad.json b/tests/regression/baselines/ethyl-acetate/rad.json index ee7df624..eabfffe2 100644 --- a/tests/regression/baselines/ethyl-acetate/rad.json +++ b/tests/regression/baselines/ethyl-acetate/rad.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 19.703248485425714, - "united_atom:Rovibrational": 49.35007067210558, - "residue:FTmat-Transvibrational": 67.91350627765567, - "residue:FTmat-Rovibrational": 60.042233035077246, + "united_atom:Transvibrational": 19.80599222598891, + "united_atom:Rovibrational": 49.35007067210563, + "residue:FTmat-Transvibrational": 68.04837872217398, + "residue:FTmat-Rovibrational": 59.99054731669011, "united_atom:Conformational": 8.175537881068413, "residue:Conformational": 0.0, "residue:Orientational": 30.739736508673403 }, - "total": 235.92433286000602 + "total": 236.11026332670048 } } } diff --git a/tests/regression/baselines/methane/default.json b/tests/regression/baselines/methane/default.json index d08ac60f..292abc03 100644 --- a/tests/regression/baselines/methane/default.json +++ b/tests/regression/baselines/methane/default.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 40.3239711717637, - "united_atom:Rovibrational": 33.60582165153992, + "united_atom:Transvibrational": 40.34034321075124, + "united_atom:Rovibrational": 33.78948111647671, "united_atom:Conformational": 0.0, "united_atom:Orientational": 3.596676624528629 }, - "total": 77.52646944783224 + "total": 77.72650095175658 } } } diff --git a/tests/regression/baselines/methane/rad.json b/tests/regression/baselines/methane/rad.json index df8fbbd7..7cd82846 100644 --- a/tests/regression/baselines/methane/rad.json +++ b/tests/regression/baselines/methane/rad.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 40.3239711717637, - "united_atom:Rovibrational": 33.60582165153992, + "united_atom:Transvibrational": 40.34034321075124, + "united_atom:Rovibrational": 33.78948111647671, "united_atom:Conformational": 0.0, "united_atom:Orientational": 6.667209510980459 }, - "total": 80.59700233428407 + "total": 80.7970338382084 } } } diff --git a/tests/regression/baselines/methanol/default.json b/tests/regression/baselines/methanol/default.json index be7f59aa..74682ab9 100644 --- a/tests/regression/baselines/methanol/default.json +++ b/tests/regression/baselines/methanol/default.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 31.71683454772323, - "residue:FTmat-Transvibrational": 57.967437606219264, - "residue:FTmat-Rovibrational": 32.05829756161347, + "united_atom:Rovibrational": 31.716834547723234, + "residue:FTmat-Transvibrational": 57.97480955865025, + "residue:FTmat-Rovibrational": 32.052731280950525, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 31.66363493251588 }, - "total": 153.40620464807185 + "total": 153.4080103198399 } } } diff --git a/tests/regression/baselines/methanol/rad.json b/tests/regression/baselines/methanol/rad.json index 3def6f3d..9f0c0f2e 100644 --- a/tests/regression/baselines/methanol/rad.json +++ b/tests/regression/baselines/methanol/rad.json @@ -3,14 +3,14 @@ "0": { "components": { "united_atom:Transvibrational": 0.0, - "united_atom:Rovibrational": 31.71683454772323, - "residue:FTmat-Transvibrational": 57.967437606219264, - "residue:FTmat-Rovibrational": 32.05829756161347, + "united_atom:Rovibrational": 31.716834547723234, + "residue:FTmat-Transvibrational": 57.97480955865025, + "residue:FTmat-Rovibrational": 32.052731280950525, "united_atom:Conformational": 0.0, "residue:Conformational": 0.0, "residue:Orientational": 17.021167486252484 }, - "total": 138.76373720180845 + "total": 138.7655428735765 } } } diff --git a/tests/regression/baselines/octonol/default.json b/tests/regression/baselines/octonol/default.json index fdd22382..f0c9cd0f 100644 --- a/tests/regression/baselines/octonol/default.json +++ b/tests/regression/baselines/octonol/default.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 37.860034170693694, - "united_atom:Rovibrational": 84.2608785308744, - "residue:FTmat-Transvibrational": 66.13571365167344, - "residue:FTmat-Rovibrational": 57.090651827515686, + "united_atom:Transvibrational": 37.773345787136414, + "united_atom:Rovibrational": 84.26087853087442, + "residue:FTmat-Transvibrational": 66.1742370152873, + "residue:FTmat-Rovibrational": 57.07006496269577, "united_atom:Conformational": 34.22940197506605, "residue:Conformational": 0.0, "residue:Orientational": 74.78356386019003 }, - "total": 354.36024401601327 + "total": 354.29149213125 } } } diff --git a/tests/regression/baselines/octonol/rad.json b/tests/regression/baselines/octonol/rad.json index c2c20839..82050480 100644 --- a/tests/regression/baselines/octonol/rad.json +++ b/tests/regression/baselines/octonol/rad.json @@ -2,15 +2,15 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 37.860034170693694, - "united_atom:Rovibrational": 84.2608785308744, - "residue:FTmat-Transvibrational": 66.13571365167344, - "residue:FTmat-Rovibrational": 57.090651827515686, + "united_atom:Transvibrational": 37.773345787136414, + "united_atom:Rovibrational": 84.26087853087442, + "residue:FTmat-Transvibrational": 66.1742370152873, + "residue:FTmat-Rovibrational": 57.07006496269577, "united_atom:Conformational": 34.22940197506605, "residue:Conformational": 0.0, "residue:Orientational": 28.084239413273323 }, - "total": 307.66091956909656 + "total": 307.5921676843333 } } } diff --git a/tests/regression/baselines/water/default.json b/tests/regression/baselines/water/default.json index c98bc3eb..51df3454 100644 --- a/tests/regression/baselines/water/default.json +++ b/tests/regression/baselines/water/default.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 43.725393337304425, - "united_atom:Rovibrational": 17.28911070147887, + "united_atom:Transvibrational": 43.71553411557926, + "united_atom:Rovibrational": 17.159953317592837, "united_atom:Conformational": 0.0, "united_atom:Orientational": 32.193445593362114 }, - "total": 93.20794963214541 + "total": 93.06893302653421 } } } diff --git a/tests/regression/baselines/water/rad.json b/tests/regression/baselines/water/rad.json index cbda37a9..c0f96bc3 100644 --- a/tests/regression/baselines/water/rad.json +++ b/tests/regression/baselines/water/rad.json @@ -2,12 +2,12 @@ "groups": { "0": { "components": { - "united_atom:Transvibrational": 79.20298312418278, - "united_atom:Rovibrational": 50.90260688502127, + "united_atom:Transvibrational": 79.1931184196587, + "united_atom:Rovibrational": 50.750640399631905, "united_atom:Conformational": 0.0, "united_atom:Orientational": 22.760377489372107 }, - "total": 152.86596749857614 + "total": 152.70413630866273 } } } From f6c724af41f63c879ec741a4f8508f0c26b9fd38 Mon Sep 17 00:00:00 2001 From: harryswift01 Date: Thu, 8 Oct 2026 14:51:56 +0100 Subject: [PATCH 12/12] refactor(axes): reword principal axes docstrings --- CodeEntropy/levels/axes.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/CodeEntropy/levels/axes.py b/CodeEntropy/levels/axes.py index 03a6cc0a..04c59315 100644 --- a/CodeEntropy/levels/axes.py +++ b/CodeEntropy/levels/axes.py @@ -1076,12 +1076,12 @@ def get_principal_axes_from_tensor( degeneracy_rtol: float = 100 * np.finfo(np.float32).eps, reference_vector: Sequence[float] = (1.0, 2.0, 3.0), ) -> tuple[np.ndarray, np.ndarray]: - """Compute reproducible principal axes and moments from a MOI tensor. + """Compute the principal axes and moments of a moment of inertia tensor. - ``np.linalg.eigh`` fixes neither the sign of each eigenvector nor the basis - within a degenerate eigenspace, and both can differ between LAPACK builds. - The axes define the frame covariances are averaged in, so this changes the - entropy. Both are therefore fixed here: + The eigenvectors of a symmetric tensor are only defined up to a sign, and, + for equal moments, up to a rotation within the degenerate eigenspace. The + axes are returned in a canonical form, so that a given tensor always + produces the same axes. The convention is: - Moments are sorted by descending absolute value. - Within a degenerate eigenspace (moments equal to within @@ -1091,9 +1091,6 @@ def get_principal_axes_from_tensor( - The first two axes are signed to have a positive projection onto ``reference_vector``, and the third is their cross product. - The reference is defined in the lab frame, so the result is reproducible - but not rotation covariant. - Args: moment_of_inertia_tensor: (3, 3) symmetric inertia tensor. degeneracy_rtol: Relative tolerance, with respect to the largest @@ -1134,7 +1131,7 @@ def get_principal_axes_from_tensor( return principal_axes, principal_moments def get_principal_axes_from_group(self, group) -> np.ndarray: - """Return the reproducible principal axes (rows) of an atom group.""" + """Return the canonical principal axes (rows) of an atom group.""" principal_axes, _ = self.get_principal_axes_from_tensor( group.atoms.moment_of_inertia() )