diff --git a/_posts/2026-10-21-release-2.11.0.md b/_posts/2026-10-21-release-2.11.0.md new file mode 100644 index 00000000..5fd79e0e --- /dev/null +++ b/_posts/2026-10-21-release-2.11.0.md @@ -0,0 +1,257 @@ +--- +layout: post +title: Release 2.11.0 of MDAnalysis +--- + +We are happy to release version 2.11.0 of MDAnalysis! + +This is a minor release of the MDAnalysis library; it contains bug fixes, +new features, and performance improvements. +These updates are backwards-compatible, with the exception of one API fix +for the [AtomicDistances][] analysis, which is noted under [Changes](#changes). + +A highlight is the **new support for mmCIF/PDBx files**, which was one of the +most-requested features (see [Changes](#changes)). + + +## Supported environments + +This release supports NumPy 2.0+ and offers backwards compatibility +through to NumPy 1.26.0. + +Supported Python versions: **3.11, 3.12, 3.13, 3.14**. + +Supported Operating Systems: + - **Linux** (on [x86-64][], [ARM64][AArch64], and [ppc64le][PPC64] + (conda-forge packages)) + - **Windows** (on [x86-64][]) + - **MacOS** (on [x86-64][] and [ARM64][]) + + + +## Upgrading to MDAnalysis version 2.11.0 + +To update with `mamba` (or `conda`) from the [conda-forge channel][] run + +```bash +mamba update -c conda-forge mdanalysis +``` + +To update from [PyPi][] with `pip` run + +```bash +python -m pip install --upgrade MDAnalysis +``` + +For more help with installation see the [installation instructions in the User Guide][]. +Make sure you are using a Python version compatible with MDAnalysis +before upgrading (Python >= 3.11). + + +## Notable changes + +For a full list of changes, enhancements, bug fixes and deprecations see the [CHANGELOG][]. + +#### Enhancements: + +* Single-frame [mmCIF/PDBx][mmCIF] files, including `.cif.gz`, can now be + read with the optional [gemmi][] library ([Issue #2367][], [PR #4712][]): + + ```python + import MDAnalysis as mda + + u = mda.Universe("structure.cif") + ``` +* New `MDAnalysis.fetch.from_PDB()` helper to download structure files from + the RCSB Protein Data Bank (optional [pooch][] dependency). It returns a + path that can be passed to `Universe` ([Issue #4907][], [PR #4943][]). + The default download is mmCIF (`.cif.gz`); pass `file_format="pdb"` for a + PDB file: + + ```python + import MDAnalysis as mda + from MDAnalysis.fetch import from_PDB + + u = mda.Universe(from_PDB("1AKE")) + ``` +* New parallelization support for: + * `analysis.diffusionmap.DistanceMatrix` ([Issue #4679][], [PR #4745][]) + * `analysis.atomicdistances.AtomicDistances` ([Issue #4662][], [PR #4822][]) +* DSSP analysis improvements: + * Proline is now included in secondary-structure assignment, following + the upstream PyDSSP 0.9.1 fix ([Issue #4913][], [PR #5065][]) + * Faster distance calculations, with a selectable distance `backend` + (for example `"distopia"`) ([PR #5182][]) +* MOL2 files can now provide unit cell dimensions from `@CRYSIN` + records ([Issue #3341][], [PR #5187][]) +* GROMACS TPR reader improvements: + * Support for TPR files written by GROMACS 2026 ([PR #5219][]) + * Linear angle potentials are read into the topology ([Issue #5361][], [PR #5372][]) + * Box vectors are now read from file and available as `Universe.dimensions` + ([Issue #5375][], [PR #5466][]) +* `AtomGroup.wrap()` with compounds is much faster and now scales close to + linearly with the number of compounds, rather than quadratically + ([PR #5226][]) + +#### Fixes: + +* Fixed periodic-boundary handling for triclinic boxes in `apply_PBC()` + and in the neighbor search used by `capped_distance()` and + `self_capped_distance()` ([Issue #4906][], [PR #5481][]): + * `apply_PBC()`, `AtomGroup.wrap()` / `pack_into_box()`, + `center*(wrap=True)`, `AtomGroup.unwrap()` with `reference="com"` or + `"cog"`, and the `transformations.wrap` transformation could leave + atoms or compound centers outside the primary unit cell when both + `b_x` and `c_y` are non-zero (for example truncated octahedra). They + were shifted by whole box vectors, so periodic distances were + unaffected, but results that depend on absolute wrapped positions + (dipole moments, densities, written coordinates) may change. + * `capped_distance()` and `self_capped_distance()` with the `nsgrid` or + `pkdtree` methods could miss pairs within the cutoff, which also + affects bond guessing and distance-based selections. `nsgrid` was + affected in triclinic boxes with two or more non-90° angles (for + example a rhombic dodecahedron); `pkdtree` in boxes with both `b_x` + and `c_y` non-zero (for example a truncated octahedron). +* GROMACS TPR file support fixes: + * Positions and velocities read from TPR files are converted to MDAnalysis + base units. Previously they were left in GROMACS native units + ([PR #5374][]) + * Fixed reading of older TPR files written before GROMACS 5.1 (TPX version + < 103) ([Issue #5145][], [PR #5146][]) +* Bond guessing now works with mixed-case atom types ([Issue #5342][], [PR #5343][]) +* NumPy boolean arrays passed to `AnalysisBase.run(frames=...)` are treated + as frame masks. Previously they were interpreted as integer frame indices, + i.e., ``True`` was parsed as frame 1 and ``False`` as frame 0, and the + analysis most likely did not produce the intended output ([Issue #5472][], [PR #5476][]) +* DSSP analysis: Hydrogen-bond detection now respects periodic boundary + conditions ([PR #5182][]) +* Fixed a `TypeError` when indexing GSD trajectories with NumPy integer + types, which stopped analysis classes from running on those trajectories + ([Issue #5224][], [PR #5260][]) +* Fixed parallel reductions that produced wrong results in multiple analysis + classes: + * mean bin values in `InterRDF` ([PR #5344][]) + * pair counts in `InterRDF_s` (wrong for one pair of groups, and an + error for more than two) ([Issue #5496][], [PR #5497][]) + * eigenvectors in `GNMAnalysis` when using multiprocessing + ([Issue #5494][], [PR #5495][]) + +#### Changes: + +* `MDAnalysis.analysis.atomicdistances.AtomicDistances` now stores its outputs + *inside* the `results` dictionary as `results.distances`, like other analysis + classes. Code that read the old attribute needs to be updated ([Issue #4819][], + [PR #5347][]). + + This fixed an API issue in a **backwards incompatible manner**. +* `AtomGroup.rotate()` and the `rotateby` trajectory transformation now + rotate velocities and forces as well as positions. The same applies to + `align.alignto()` and `AlignTraj`, which fit through `AtomGroup.rotate()`. + Previously velocities and forces were left unchanged ([Issue #5421][], [PR #5452][]) +* `WatsonCrickDist`, `MinorPairDist`, and `MajorPairDist` match the full + residue name. Previously only the first character was used, so names such + as CHARMM `DG`/`DA` or `GUA`/`ADE` were handled incorrectly. Analyses that + relied on the old truncation need explicit residue names via `g_name`, + `a_name`, and the related keyword arguments ([Issue #5360][], [PR #5365][]) + + +## Author statistics + +This release was the work of 34 contributors, **22** of which are **new contributors**. + +Our **new contributors** are: + +* @spyke7 +* @Pranay096 +* @PardhavMaradani ([GSoC contributor]({% post_url 2026-05-21-gsoc-students %}#pardhav-maradani-dashboard-for-tracking-md-simulation-progress-with-the-new-streaming-interface)) +* @tani-dubey +* @BradyAJohnston (new [CoreDeveloper]({{ site.baseurl}}/pages/governance/#mdanalysis-core-developers)) +* @IAyaanHere +* @khushi-phougat +* @Dreamstick9 +* @jeremyleung521 +* @harshitgajjela-droid +* @kunjsinha ([GSoC contributor]({% post_url 2026-05-21-gsoc-students %}#kunj-sinha-interface-for-post-simulation-analysis-crawling-of-westpa-simulations-)) +* @aygarwal +* @ParthUppal523 +* @ollyfutur +* @Amarendra22 +* @shubhammittal2241 +* @charity-g +* @saiudayagiri +* @apoorva-01 +* @Aryaman-Chaudhri +* @sici17 +* @AkshitBoora + + +## Acknowledgements + +MDAnalysis thanks [NumFOCUS][] for its continued support as our fiscal sponsor, +the [Chan Zuckerberg Initiative][] for supporting MDAnalysis under an EOSS5 award, +and the [National Science Foundation][NSF] for support under CSSI award +[2311372][NSF CSSI 2311372]. + +— @IAlibay on behalf of the [MDAnalysis Team][] + + +---- + +[AtomicDistances]: https://docs.mdanalysis.org/2.11.0/documentation_pages/analysis/atomicdistances.html#MDAnalysis.analysis.atomicdistances.AtomicDistances +[x86-64]: https://en.wikipedia.org/wiki/X86-64 +[AArch64]: https://en.wikipedia.org/wiki/AArch64 +[ARM64]: https://en.wikipedia.org/wiki/Apple_M1 +[PPC64]: https://en.wikipedia.org/wiki/Ppc64 +[installation instructions in the User Guide]: https://userguide.mdanalysis.org/stable/installation.html +[conda-forge channel]: https://anaconda.org/conda-forge/mdanalysis +[PyPi]: https://pypi.org/project/MDAnalysis/ +[NumFOCUS]: https://www.numfocus.org +[CHANGELOG]: https://github.com/MDAnalysis/mdanalysis/blob/release-2.11.0/package/CHANGELOG +[Chan Zuckerberg Initiative]: https://chanzuckerberg.com/ +[NSF]: https://www.nsf.gov +[NSF CSSI 2311372]: https://www.nsf.gov/awardsearch/show-award/?AWD_ID=2311372 +[MDAnalysis Team]: {{ site.baseurl }}/pages/team +[mmCIF]: https://mmcif.wwpdb.org/ +[gemmi]: https://gemmi.readthedocs.io/ +[pooch]: https://www.fatiando.org/pooch/latest/ +[Issue #4679]: https://github.com/MDAnalysis/mdanalysis/issues/4679 +[PR #4745]: https://github.com/MDAnalysis/mdanalysis/pull/4745 +[Issue #4662]: https://github.com/MDAnalysis/mdanalysis/issues/4662 +[PR #4822]: https://github.com/MDAnalysis/mdanalysis/pull/4822 +[Issue #4913]: https://github.com/MDAnalysis/mdanalysis/issues/4913 +[PR #5065]: https://github.com/MDAnalysis/mdanalysis/pull/5065 +[PR #5182]: https://github.com/MDAnalysis/mdanalysis/pull/5182 +[Issue #2367]: https://github.com/MDAnalysis/mdanalysis/issues/2367 +[PR #4712]: https://github.com/MDAnalysis/mdanalysis/pull/4712 +[Issue #4907]: https://github.com/MDAnalysis/mdanalysis/issues/4907 +[PR #4943]: https://github.com/MDAnalysis/mdanalysis/pull/4943 +[Issue #3341]: https://github.com/MDAnalysis/mdanalysis/issues/3341 +[PR #5187]: https://github.com/MDAnalysis/mdanalysis/pull/5187 +[PR #5219]: https://github.com/MDAnalysis/mdanalysis/pull/5219 +[Issue #5361]: https://github.com/MDAnalysis/mdanalysis/issues/5361 +[PR #5372]: https://github.com/MDAnalysis/mdanalysis/pull/5372 +[Issue #5375]: https://github.com/MDAnalysis/mdanalysis/issues/5375 +[PR #5466]: https://github.com/MDAnalysis/mdanalysis/pull/5466 +[PR #5226]: https://github.com/MDAnalysis/mdanalysis/pull/5226 +[PR #5374]: https://github.com/MDAnalysis/mdanalysis/pull/5374 +[Issue #5145]: https://github.com/MDAnalysis/mdanalysis/issues/5145 +[PR #5146]: https://github.com/MDAnalysis/mdanalysis/pull/5146 +[Issue #4906]: https://github.com/MDAnalysis/mdanalysis/issues/4906 +[PR #5481]: https://github.com/MDAnalysis/mdanalysis/pull/5481 +[Issue #5472]: https://github.com/MDAnalysis/mdanalysis/issues/5472 +[PR #5476]: https://github.com/MDAnalysis/mdanalysis/pull/5476 +[Issue #5224]: https://github.com/MDAnalysis/mdanalysis/issues/5224 +[PR #5260]: https://github.com/MDAnalysis/mdanalysis/pull/5260 +[PR #5344]: https://github.com/MDAnalysis/mdanalysis/pull/5344 +[Issue #5496]: https://github.com/MDAnalysis/mdanalysis/issues/5496 +[PR #5497]: https://github.com/MDAnalysis/mdanalysis/pull/5497 +[Issue #5494]: https://github.com/MDAnalysis/mdanalysis/issues/5494 +[PR #5495]: https://github.com/MDAnalysis/mdanalysis/pull/5495 +[Issue #5342]: https://github.com/MDAnalysis/mdanalysis/issues/5342 +[PR #5343]: https://github.com/MDAnalysis/mdanalysis/pull/5343 +[Issue #4819]: https://github.com/MDAnalysis/mdanalysis/issues/4819 +[PR #5347]: https://github.com/MDAnalysis/mdanalysis/pull/5347 +[Issue #5421]: https://github.com/MDAnalysis/mdanalysis/issues/5421 +[PR #5452]: https://github.com/MDAnalysis/mdanalysis/pull/5452 +[Issue #5360]: https://github.com/MDAnalysis/mdanalysis/issues/5360 +[PR #5365]: https://github.com/MDAnalysis/mdanalysis/pull/5365