diff --git a/package/CHANGELOG b/package/CHANGELOG index 2f023d1337a..7ac8f41b184 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -37,6 +37,7 @@ Fixes DSSP by porting upstream PyDSSP 0.9.1 fix (Issue #4913) Enhancements + * Adds support for parsing `.tpr` files produced by GROMACS 2026.0 * Enables parallelization for analysis.diffusionmap.DistanceMatrix (Issue #4679, PR #4745) diff --git a/package/MDAnalysis/topology/TPRParser.py b/package/MDAnalysis/topology/TPRParser.py index 82eca33d97d..09cbdcdf6e4 100644 --- a/package/MDAnalysis/topology/TPRParser.py +++ b/package/MDAnalysis/topology/TPRParser.py @@ -69,6 +69,7 @@ 133 28 2024.1 yes 134 28 2024.4 yes 137 28 2025.0 yes + 138 29 2026.0 yes ========== ============== ==================== ===== .. [*] Files generated by the beta versions of Gromacs 2020 are NOT supported. diff --git a/package/MDAnalysis/topology/tpr/setting.py b/package/MDAnalysis/topology/tpr/setting.py index 0308cedc9e2..1f050495c03 100644 --- a/package/MDAnalysis/topology/tpr/setting.py +++ b/package/MDAnalysis/topology/tpr/setting.py @@ -54,6 +54,7 @@ 133, 134, 137, + 138, ) # Some constants diff --git a/testsuite/MDAnalysisTests/coordinates/test_tpr.py b/testsuite/MDAnalysisTests/coordinates/test_tpr.py index 6ae62ba7e00..8f27c3fdea8 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_tpr.py +++ b/testsuite/MDAnalysisTests/coordinates/test_tpr.py @@ -64,6 +64,7 @@ TPR455Double, TPR_xvf_2024_4, TPR_NNPOT_2025_0, + TPR_NNPOT_2026_0, TPR2020B2, INPCRD, TPR_gh_5145, @@ -82,6 +83,14 @@ # this case is an alanine dipeptide # with neural network potential active # and nonzero velocities + ( + TPR_NNPOT_2026_0, # tpx 138 + [2.36700e00, 2.30000e-02, 9.20000e-02], + [2.95100e00, 2.00000e-01, 2.41000e-01], + (23, 3), + [-4.72100e-01, -2.20900e-01, -2.42800e-01], + [-1.11900e-01, -3.69300e-01, -6.10000e-03], + ), ( TPR_NNPOT_2025_0, # tpx 137 [2.36700e00, 2.30000e-02, 9.20000e-02], diff --git a/testsuite/MDAnalysisTests/data/tprs/2lyz_gmx_2026_0.tpr b/testsuite/MDAnalysisTests/data/tprs/2lyz_gmx_2026_0.tpr new file mode 100644 index 00000000000..11be505afb3 Binary files /dev/null and b/testsuite/MDAnalysisTests/data/tprs/2lyz_gmx_2026_0.tpr differ diff --git a/testsuite/MDAnalysisTests/data/tprs/ala_nnpot_gmx_2026_0.tpr b/testsuite/MDAnalysisTests/data/tprs/ala_nnpot_gmx_2026_0.tpr new file mode 100644 index 00000000000..e30976748c3 Binary files /dev/null and b/testsuite/MDAnalysisTests/data/tprs/ala_nnpot_gmx_2026_0.tpr differ diff --git a/testsuite/MDAnalysisTests/data/tprs/all_bonded/dummy_2026_0.tpr b/testsuite/MDAnalysisTests/data/tprs/all_bonded/dummy_2026_0.tpr new file mode 100644 index 00000000000..6fab529b3ea Binary files /dev/null and b/testsuite/MDAnalysisTests/data/tprs/all_bonded/dummy_2026_0.tpr differ diff --git a/testsuite/MDAnalysisTests/data/tprs/virtual_sites/extra-interactions-2026_0.tpr b/testsuite/MDAnalysisTests/data/tprs/virtual_sites/extra-interactions-2026_0.tpr new file mode 100644 index 00000000000..923aabb6233 Binary files /dev/null and b/testsuite/MDAnalysisTests/data/tprs/virtual_sites/extra-interactions-2026_0.tpr differ diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index 01336e8aa9a..396bdbd86ab 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -136,6 +136,7 @@ "TPR2024", "TPR2024_4", "TPR2025_0", + "TPR2026_0", "TPR510_bonded", "TPR2016_bonded", "TPR2018_bonded", @@ -151,6 +152,7 @@ "TPR2024_bonded", "TPR2024_4_bonded", "TPR2025_0_bonded", + "TPR2026_0_bonded", "TPR_EXTRA_2021", "TPR_EXTRA_2020", "TPR_EXTRA_2018", @@ -161,7 +163,9 @@ "TPR_EXTRA_2024", "TPR_EXTRA_2024_4", "TPR_EXTRA_2025_0", + "TPR_EXTRA_2026_0", "TPR_NNPOT_2025_0", + "TPR_NNPOT_2026_0", "PDB_sub_sol", "PDB_sub_dry", # TRRReader sub selection "TRR_sub_sol", @@ -568,6 +572,7 @@ TPR2024 = (_data_ref / "tprs/2lyz_gmx_2024.tpr").as_posix() TPR2024_4 = (_data_ref / "tprs/2lyz_gmx_2024_4.tpr").as_posix() TPR2025_0 = (_data_ref / "tprs/2lyz_gmx_2025_0.tpr").as_posix() +TPR2026_0 = (_data_ref / "tprs/2lyz_gmx_2026_0.tpr").as_posix() # double precision TPR455Double = (_data_ref / "tprs/drew_gmx_4.5.5.double.tpr").as_posix() TPR460 = (_data_ref / "tprs/ab42_gmx_4.6.tpr").as_posix() @@ -600,7 +605,11 @@ TPR2024_bonded = (_data_ref / "tprs/all_bonded/dummy_2024.tpr").as_posix() TPR2024_4_bonded = (_data_ref / "tprs/all_bonded/dummy_2024_4.tpr").as_posix() TPR2025_0_bonded = (_data_ref / "tprs/all_bonded/dummy_2025_0.tpr").as_posix() +TPR2026_0_bonded = (_data_ref / "tprs/all_bonded/dummy_2026_0.tpr").as_posix() # all interactions +TPR_EXTRA_2026_0 = ( + _data_ref / "tprs/virtual_sites/extra-interactions-2026_0.tpr" +).as_posix() TPR_EXTRA_2025_0 = ( _data_ref / "tprs/virtual_sites/extra-interactions-2025_0.tpr" ).as_posix() @@ -633,6 +642,7 @@ ).as_posix() # ALA dipeptide with neural network potential and a few other options TPR_NNPOT_2025_0 = (_data_ref / "tprs/ala_nnpot_gmx_2025_0.tpr").as_posix() +TPR_NNPOT_2026_0 = (_data_ref / "tprs/ala_nnpot_gmx_2026_0.tpr").as_posix() XYZ_psf = (_data_ref / "2r9r-1b.psf").as_posix() XYZ_bz2 = (_data_ref / "2r9r-1b.xyz.bz2").as_posix() diff --git a/testsuite/MDAnalysisTests/topology/test_tprparser.py b/testsuite/MDAnalysisTests/topology/test_tprparser.py index b8ec5425d14..354b41cbedc 100644 --- a/testsuite/MDAnalysisTests/topology/test_tprparser.py +++ b/testsuite/MDAnalysisTests/topology/test_tprparser.py @@ -34,13 +34,13 @@ TPR2016, TPR2018, TPR2019B3, TPR2020, TPR2020B2, TPR2021, TPR2022RC1, TPR2023, TPR2024, TPR2024_4, - TPR2025_0, + TPR2025_0, TPR2026_0, TPR_EXTRA_407, TPR_EXTRA_2016, TPR_EXTRA_2018, TPR_EXTRA_2020, TPR_EXTRA_2021, TPR_EXTRA_2022RC1, TPR_EXTRA_2023, TPR_EXTRA_2024, TPR_EXTRA_2024_4, XTC, TPR334_bonded, - TPR_EXTRA_2025_0, + TPR_EXTRA_2025_0, TPR_EXTRA_2026_0, TPR455Double, TPR510_bonded, TPR2016_bonded, TPR2018_bonded, TPR2019B3_bonded, TPR2020_bonded, @@ -50,7 +50,8 @@ TPR2021Double, TPR2022RC1_bonded, TPR2023_bonded, TPR2024_4_bonded, TPR2025_0_bonded, TPR2024_bonded, - TPR_NNPOT_2025_0) + TPR2026_0_bonded, + TPR_NNPOT_2025_0, TPR_NNPOT_2026_0) from numpy.testing import assert_equal # fmt: on @@ -70,6 +71,8 @@ TPR2024_bonded, TPR2024_4_bonded, TPR2025_0_bonded, + TPR2026_0_bonded, + TPR_EXTRA_2026_0, TPR_EXTRA_2025_0, TPR_EXTRA_2024_4, TPR_EXTRA_2024, @@ -154,7 +157,7 @@ class TestTPRGromacsVersions(TPRAttrs): TPR451, TPR452, TPR453, TPR454, TPR455, TPR502, TPR504, TPR505, TPR510, TPR2016, TPR2018, TPR2019B3, TPR2020, TPR2020Double, TPR2021, TPR2021Double, TPR2022RC1, TPR2023, TPR2024, TPR2024_4, - TPR2025_0, + TPR2025_0, TPR2026_0, ] ) # fmt: on @@ -220,7 +223,7 @@ class TestTPRNnpot(TPRAttrs): ref_molnums = np.array([0] * 2) ref_chainIDs = ["A"] - @pytest.fixture(params=[TPR_NNPOT_2025_0]) + @pytest.fixture(params=[TPR_NNPOT_2025_0, TPR_NNPOT_2026_0]) def filename(self, request): return request.param @@ -357,7 +360,7 @@ def test_settle(bonds_water): assert bonds_water[-1][1] == 2262 -@pytest.mark.parametrize("tpr_path", [TPR_NNPOT_2025_0]) +@pytest.mark.parametrize("tpr_path", [TPR_NNPOT_2025_0, TPR_NNPOT_2026_0]) def test_ala2(tpr_path): topology = MDAnalysis.topology.TPRParser.TPRParser(tpr_path).parse() # Check that bonds etc are read correctly