From 2cef10cb39594a438605cf2740f47586a3ed1728 Mon Sep 17 00:00:00 2001 From: cherr Date: Wed, 25 Mar 2026 00:22:08 -0700 Subject: [PATCH 01/14] standardize documentation and code to use results --- package/MDAnalysis/analysis/atomicdistances.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/analysis/atomicdistances.py b/package/MDAnalysis/analysis/atomicdistances.py index 71292bed0d7..688e6b2d511 100644 --- a/package/MDAnalysis/analysis/atomicdistances.py +++ b/package/MDAnalysis/analysis/atomicdistances.py @@ -74,10 +74,10 @@ >>> ag2 = u.atoms[4000:4005] We can run the calculations using any variable of choice such as -``my_dists`` and access our results using ``my_dists.results``: :: +``my_dists`` and access our results using ``my_dists.results.distances``: :: >>> my_dists = ad.AtomicDistances(ag1, ag2).run() - >>> my_dists.results + >>> my_dists.results.distances array([[37.80813681, 33.2594864 , 34.93676414, 34.51183299, 34.96340209], [27.11746625, 31.19878079, 31.69439435, 32.63446126, 33.10451345], [23.27210749, 30.38714688, 32.48269361, 31.91444505, 31.84583838], @@ -94,7 +94,7 @@ in this case: :: >>> my_dists_nopbc = ad.AtomicDistances(ag1, ag2, pbc=False).run() - >>> my_dists_nopbc.results + >>> my_dists_nopbc.results.distances array([[37.80813681, 33.2594864 , 34.93676414, 34.51183299, 34.96340209], [27.11746625, 31.19878079, 31.69439435, 32.63446126, 33.10451345], [23.27210749, 30.38714688, 32.482695 , 31.91444505, 31.84583838], @@ -108,6 +108,7 @@ """ +from mdanalysis.package.MDAnalysis.analysis.results import Results, ResultsGroup import numpy as np from MDAnalysis.lib.distances import calc_bonds @@ -134,7 +135,7 @@ class AtomicDistances(AnalysisBase): Attributes ---------- - results : :class:`numpy.ndarray` + results.distances : :class:`numpy.ndarray` The distances :math:`|ag1[i] - ag2[i]|` for all :math:`i` from :math:`0` to `n_atoms` :math:`- 1` for each frame over the trajectory. @@ -142,9 +143,7 @@ class AtomicDistances(AnalysisBase): Number of frames included in the analysis. n_atoms : int Number of atoms in each atom group. - - - .. versionadded:: 2.5.0 + .. versionchanged:: 2.11.0 """ def __init__(self, ag1, ag2, pbc=True, **kwargs): @@ -167,7 +166,8 @@ def __init__(self, ag1, ag2, pbc=True, **kwargs): def _prepare(self): # initialize NumPy array of frames x distances for results - self.results = np.zeros((self.n_frames, self._ag1.atoms.n_atoms)) + distances = np.zeros((self.n_frames, self._ag1.atoms.n_atoms)) + self.results = Results(distances=distances) def _single_frame(self): # if PBCs considered, get box size From f858d04bf77aaaa5eb857e939c6ca888829f583c Mon Sep 17 00:00:00 2001 From: cherr Date: Wed, 25 Mar 2026 00:22:16 -0700 Subject: [PATCH 02/14] update tests --- .../MDAnalysisTests/analysis/test_atomicdistances.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py b/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py index 4697485470b..07e5a8c05a9 100644 --- a/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py +++ b/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py @@ -20,6 +20,7 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # +from mdanalysis.package.MDAnalysis.analysis.results import Results import pytest import MDAnalysis as mda @@ -121,15 +122,19 @@ def test_ad_pairwise_dist(self, ad_ag1, ad_ag2, expected_dist): correctly calculated without PBCs.""" pairwise_no_pbc = ad.AtomicDistances(ad_ag1, ad_ag2, pbc=False).run() actual = pairwise_no_pbc.results - + assert isinstance(actual, Results) + + distances = actual.distances # compare with expected values from dist() - assert_allclose(actual, expected_dist) + assert_allclose(distances, expected_dist) def test_ad_pairwise_dist_pbc(self, ad_ag1, ad_ag2, expected_pbc_dist): """Ensure that pairwise distances between atoms are correctly calculated with PBCs.""" pairwise_pbc = ad.AtomicDistances(ad_ag1, ad_ag2).run() actual = pairwise_pbc.results + assert isinstance(actual, Results) + distances = actual.distances # compare with expected values from dist() - assert_allclose(actual, expected_pbc_dist) + assert_allclose(distances, expected_pbc_dist) From b744dc13c50171d246d66e5539a9968c8cba1974 Mon Sep 17 00:00:00 2001 From: cherr Date: Thu, 26 Mar 2026 23:29:18 -0700 Subject: [PATCH 03/14] add changelog authors for PR --- package/AUTHORS | 1 + package/CHANGELOG | 1 + 2 files changed, 2 insertions(+) diff --git a/package/AUTHORS b/package/AUTHORS index 81ada5e07ca..3126c41bb49 100644 --- a/package/AUTHORS +++ b/package/AUTHORS @@ -277,6 +277,7 @@ Chronological list of authors - Ayush Agarwal - Parth Uppal - Olivier Languin--Cattoën + - Charity Grey External code ------------- diff --git a/package/CHANGELOG b/package/CHANGELOG index 1a36fce7284..8175cb582c4 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -61,6 +61,7 @@ Enhancements Changes * The msd.py inside analysis is changed, and ProgressBar is implemented inside _conclude_simple and _conclude_fft functions instead of tqdm (Issue #5144, PR #5153) + * `MDAnalysis.analysis.atomicdistances.AtomicDistances` results are now consistent with expected`analysis` documentation data type = Results (Issue #4819) Deprecations From 965f590f51d44e522f9d1bbe7a8edef5b8caa38b Mon Sep 17 00:00:00 2001 From: cherr Date: Thu, 26 Mar 2026 23:46:45 -0700 Subject: [PATCH 04/14] add percieved aggregation --- package/MDAnalysis/analysis/atomicdistances.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/atomicdistances.py b/package/MDAnalysis/analysis/atomicdistances.py index 688e6b2d511..0aa4882a43d 100644 --- a/package/MDAnalysis/analysis/atomicdistances.py +++ b/package/MDAnalysis/analysis/atomicdistances.py @@ -108,7 +108,10 @@ """ -from mdanalysis.package.MDAnalysis.analysis.results import Results, ResultsGroup +from mdanalysis.package.MDAnalysis.analysis.results import ( + Results, + ResultsGroup, +) import numpy as np from MDAnalysis.lib.distances import calc_bonds @@ -175,3 +178,6 @@ def _single_frame(self): self.results[self._frame_index] = calc_bonds( self._ag1.positions, self._ag2.positions, box ) + + def _get_aggregator(self): + return ResultsGroup(lookup={"distances": ResultsGroup.ndarray_vstack}) \ No newline at end of file From db79395c684044d43657ce0eaf655974b38a0ccd Mon Sep 17 00:00:00 2001 From: cherr Date: Sat, 4 Apr 2026 14:01:43 -0700 Subject: [PATCH 05/14] remove aggregator --- package/MDAnalysis/analysis/atomicdistances.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/package/MDAnalysis/analysis/atomicdistances.py b/package/MDAnalysis/analysis/atomicdistances.py index 0aa4882a43d..aa6c24b724f 100644 --- a/package/MDAnalysis/analysis/atomicdistances.py +++ b/package/MDAnalysis/analysis/atomicdistances.py @@ -177,7 +177,4 @@ def _single_frame(self): box = self._ag1.dimensions if self._pbc else None self.results[self._frame_index] = calc_bonds( self._ag1.positions, self._ag2.positions, box - ) - - def _get_aggregator(self): - return ResultsGroup(lookup={"distances": ResultsGroup.ndarray_vstack}) \ No newline at end of file + ) \ No newline at end of file From 0fb7c366270717562bcaa7c97a8c6cd9fd67f1f6 Mon Sep 17 00:00:00 2001 From: cherr Date: Sat, 4 Apr 2026 14:03:19 -0700 Subject: [PATCH 06/14] remove local import --- testsuite/MDAnalysisTests/analysis/test_atomicdistances.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py b/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py index 07e5a8c05a9..a6805f3d5fc 100644 --- a/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py +++ b/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py @@ -20,7 +20,6 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -from mdanalysis.package.MDAnalysis.analysis.results import Results import pytest import MDAnalysis as mda @@ -28,6 +27,7 @@ import MDAnalysis.analysis.atomicdistances as ad from MDAnalysis.lib.distances import calc_bonds import MDAnalysis.transformations.boxdimensions as bd +from MDAnalysis.analysis.results import Results from numpy.testing import assert_allclose import numpy as np From 1970f59a332daa4e58371d2d9ed7935cbf37fb01 Mon Sep 17 00:00:00 2001 From: cherr Date: Sat, 4 Apr 2026 14:04:17 -0700 Subject: [PATCH 07/14] remove local import in package itself --- package/MDAnalysis/analysis/atomicdistances.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/analysis/atomicdistances.py b/package/MDAnalysis/analysis/atomicdistances.py index aa6c24b724f..a44b5268651 100644 --- a/package/MDAnalysis/analysis/atomicdistances.py +++ b/package/MDAnalysis/analysis/atomicdistances.py @@ -108,13 +108,13 @@ """ -from mdanalysis.package.MDAnalysis.analysis.results import ( - Results, - ResultsGroup, -) + import numpy as np from MDAnalysis.lib.distances import calc_bonds +from MDAnalysis.analysis.results import ( + Results, +) import logging from .base import AnalysisBase From 139ef3a5381a34c26c28b8f7d715b299a1bbc0c0 Mon Sep 17 00:00:00 2001 From: cherr Date: Sat, 4 Apr 2026 14:12:29 -0700 Subject: [PATCH 08/14] fix CHANGELOG format --- package/CHANGELOG | 4 ++-- package/MDAnalysis/analysis/atomicdistances.py | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 8175cb582c4..ee79462b74b 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -22,6 +22,7 @@ The rules for this file: * 2.11.0 Fixes + * `MDAnalysis.analysis.atomicdistances.AtomicDistances` results are now consistent with expected `analysis` documentation data type = Results (Issue #4819, PR #5347) Note: This fix is backwards-incompatible. * Fixes msd for non-linear frames, when non_linear is not explicitly provided (Issue #5100, PR #5254) * Fixes TypeError with np.int64 indexing in GSD Reader (Issue #5224) @@ -37,7 +38,7 @@ Fixes incomprehensible broadcasting error at execution time (Issue #5046, PR #5163) * Fixes the verbose=False in EinsteinMSD, and only shows progress bar when verbose=True (Issue #5144, PR #5153) - * Fix incorrect assignment of topology_format to format (and vice versa) + * Fix incorrect assignment of topology_format to format (and vexice versa) when a parsing class is provided to either (Issue #5147, PR #5148) * Fix incorrect TPR file parsing for GROMACS topologies produced prior to version 5.1.0 (Issue #5145, PR #5146) @@ -61,7 +62,6 @@ Enhancements Changes * The msd.py inside analysis is changed, and ProgressBar is implemented inside _conclude_simple and _conclude_fft functions instead of tqdm (Issue #5144, PR #5153) - * `MDAnalysis.analysis.atomicdistances.AtomicDistances` results are now consistent with expected`analysis` documentation data type = Results (Issue #4819) Deprecations diff --git a/package/MDAnalysis/analysis/atomicdistances.py b/package/MDAnalysis/analysis/atomicdistances.py index a44b5268651..82d74881dc7 100644 --- a/package/MDAnalysis/analysis/atomicdistances.py +++ b/package/MDAnalysis/analysis/atomicdistances.py @@ -146,6 +146,9 @@ class AtomicDistances(AnalysisBase): Number of frames included in the analysis. n_atoms : int Number of atoms in each atom group. + + + .. versionadded:: 2.5.0 .. versionchanged:: 2.11.0 """ From 2531f26fd865274b156cb9b0af268bf7e96c64ec Mon Sep 17 00:00:00 2001 From: charity-g <96224472+charity-g@users.noreply.github.com> Date: Sat, 4 Apr 2026 14:13:00 -0700 Subject: [PATCH 09/14] Update package/MDAnalysis/analysis/atomicdistances.py Co-authored-by: Oliver Beckstein --- package/MDAnalysis/analysis/atomicdistances.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/package/MDAnalysis/analysis/atomicdistances.py b/package/MDAnalysis/analysis/atomicdistances.py index 0aa4882a43d..4ca2d59f92f 100644 --- a/package/MDAnalysis/analysis/atomicdistances.py +++ b/package/MDAnalysis/analysis/atomicdistances.py @@ -147,6 +147,13 @@ class AtomicDistances(AnalysisBase): n_atoms : int Number of atoms in each atom group. .. versionchanged:: 2.11.0 + Distance data are now made available in :attr:`results.distances` instead + of :attr:`results` and :attr:`results` is now a + :class:`~MDAnalysis.analysis.results.Results` instance; this fixes an API issue + (see `Issue #4819`_) in a *backwards-incompatible* manner. + + .. _Issue #4819`: https://github.com/MDAnalysis/mdanalysis/issues/4819 + """ def __init__(self, ag1, ag2, pbc=True, **kwargs): From e94f71ae05b595ca6893bbb70c9005d610f4bb5a Mon Sep 17 00:00:00 2001 From: cherr Date: Sun, 5 Apr 2026 19:17:08 -0700 Subject: [PATCH 10/14] linted --- package/MDAnalysis/analysis/atomicdistances.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/analysis/atomicdistances.py b/package/MDAnalysis/analysis/atomicdistances.py index da3f9c02b59..9ea3189ebe7 100644 --- a/package/MDAnalysis/analysis/atomicdistances.py +++ b/package/MDAnalysis/analysis/atomicdistances.py @@ -151,12 +151,12 @@ class AtomicDistances(AnalysisBase): .. versionadded:: 2.5.0 .. versionchanged:: 2.11.0 Distance data are now made available in :attr:`results.distances` instead - of :attr:`results` and :attr:`results` is now a - :class:`~MDAnalysis.analysis.results.Results` instance; this fixes an API issue + of :attr:`results` and :attr:`results` is now a + :class:`~MDAnalysis.analysis.results.Results` instance; this fixes an API issue (see `Issue #4819`_) in a *backwards-incompatible* manner. - + .. _Issue #4819`: https://github.com/MDAnalysis/mdanalysis/issues/4819 - + """ def __init__(self, ag1, ag2, pbc=True, **kwargs): @@ -187,4 +187,4 @@ def _single_frame(self): box = self._ag1.dimensions if self._pbc else None self.results[self._frame_index] = calc_bonds( self._ag1.positions, self._ag2.positions, box - ) \ No newline at end of file + ) From aa79f61d108aff84c23741d202e72b3a8d7d4acc Mon Sep 17 00:00:00 2001 From: cherr Date: Sat, 11 Apr 2026 10:15:09 -0700 Subject: [PATCH 11/14] remove typo in CHANGELOG --- package/CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index ee79462b74b..333ca20cab5 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -38,7 +38,7 @@ Fixes incomprehensible broadcasting error at execution time (Issue #5046, PR #5163) * Fixes the verbose=False in EinsteinMSD, and only shows progress bar when verbose=True (Issue #5144, PR #5153) - * Fix incorrect assignment of topology_format to format (and vexice versa) + * Fix incorrect assignment of topology_format to format (and vice versa) when a parsing class is provided to either (Issue #5147, PR #5148) * Fix incorrect TPR file parsing for GROMACS topologies produced prior to version 5.1.0 (Issue #5145, PR #5146) From 062c598e73a42dd90997f13ce1b1fcd66d149fb6 Mon Sep 17 00:00:00 2001 From: cherr Date: Sat, 11 Apr 2026 10:27:47 -0700 Subject: [PATCH 12/14] update new results.distances attribute --- package/MDAnalysis/analysis/atomicdistances.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/analysis/atomicdistances.py b/package/MDAnalysis/analysis/atomicdistances.py index 9ea3189ebe7..9e51383d8fe 100644 --- a/package/MDAnalysis/analysis/atomicdistances.py +++ b/package/MDAnalysis/analysis/atomicdistances.py @@ -112,9 +112,7 @@ import numpy as np from MDAnalysis.lib.distances import calc_bonds -from MDAnalysis.analysis.results import ( - Results, -) +from MDAnalysis.analysis.results import Results import logging from .base import AnalysisBase @@ -185,6 +183,6 @@ def _prepare(self): def _single_frame(self): # if PBCs considered, get box size box = self._ag1.dimensions if self._pbc else None - self.results[self._frame_index] = calc_bonds( + self.results.distances[self._frame_index] = calc_bonds( self._ag1.positions, self._ag2.positions, box ) From fbafeb02d99251cb57c69de027453109eaa75209 Mon Sep 17 00:00:00 2001 From: cherr Date: Sat, 11 Apr 2026 10:58:36 -0700 Subject: [PATCH 13/14] Fix darker suggestions --- package/MDAnalysis/analysis/atomicdistances.py | 1 - testsuite/MDAnalysisTests/analysis/test_atomicdistances.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/package/MDAnalysis/analysis/atomicdistances.py b/package/MDAnalysis/analysis/atomicdistances.py index 9e51383d8fe..5201997d2dd 100644 --- a/package/MDAnalysis/analysis/atomicdistances.py +++ b/package/MDAnalysis/analysis/atomicdistances.py @@ -108,7 +108,6 @@ """ - import numpy as np from MDAnalysis.lib.distances import calc_bonds diff --git a/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py b/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py index a6805f3d5fc..5ed81303fe1 100644 --- a/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py +++ b/testsuite/MDAnalysisTests/analysis/test_atomicdistances.py @@ -123,7 +123,6 @@ def test_ad_pairwise_dist(self, ad_ag1, ad_ag2, expected_dist): pairwise_no_pbc = ad.AtomicDistances(ad_ag1, ad_ag2, pbc=False).run() actual = pairwise_no_pbc.results assert isinstance(actual, Results) - distances = actual.distances # compare with expected values from dist() assert_allclose(distances, expected_dist) @@ -134,7 +133,6 @@ def test_ad_pairwise_dist_pbc(self, ad_ag1, ad_ag2, expected_pbc_dist): pairwise_pbc = ad.AtomicDistances(ad_ag1, ad_ag2).run() actual = pairwise_pbc.results assert isinstance(actual, Results) - distances = actual.distances # compare with expected values from dist() assert_allclose(distances, expected_pbc_dist) From 77f17c0f0e05e82e44ee9993356cc482df9e6b03 Mon Sep 17 00:00:00 2001 From: cherr Date: Sat, 11 Apr 2026 11:13:22 -0700 Subject: [PATCH 14/14] Fix atomicdistances result usage for checking purposes --- testsuite/MDAnalysisTests/coordinates/test_trc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_trc.py b/testsuite/MDAnalysisTests/coordinates/test_trc.py index 5069fe3ed31..75210ff1ee4 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_trc.py +++ b/testsuite/MDAnalysisTests/coordinates/test_trc.py @@ -227,7 +227,7 @@ def test_trc_distances(self, TRC_U): dist_B = ( atomicdistances.AtomicDistances(ag1, ag2, pbc=True) .run() - .results[0] + .results.distances[0] ) assert_allclose(