From 7d1340c52409a916fedd4f05eb59a7466c82e7c5 Mon Sep 17 00:00:00 2001 From: Yuxuan Zhuang Date: Tue, 8 Apr 2025 15:20:46 +0200 Subject: [PATCH 1/4] add sel as property and update ag when changed --- .../analysis/hydrogenbonds/hbond_analysis.py | 49 ++++++++++++++++--- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/package/MDAnalysis/analysis/hydrogenbonds/hbond_analysis.py b/package/MDAnalysis/analysis/hydrogenbonds/hbond_analysis.py index b25ee4b165..fecde62cd3 100644 --- a/package/MDAnalysis/analysis/hydrogenbonds/hbond_analysis.py +++ b/package/MDAnalysis/analysis/hydrogenbonds/hbond_analysis.py @@ -350,9 +350,9 @@ def __init__(self, universe, self.u = universe self._trajectory = self.u.trajectory - self.donors_sel = donors_sel.strip() if donors_sel is not None else donors_sel - self.hydrogens_sel = hydrogens_sel.strip() if hydrogens_sel is not None else hydrogens_sel - self.acceptors_sel = acceptors_sel.strip() if acceptors_sel is not None else acceptors_sel + self._donors_sel = donors_sel.strip() if donors_sel is not None else donors_sel + self._hydrogens_sel = hydrogens_sel.strip() if hydrogens_sel is not None else hydrogens_sel + self._acceptors_sel = acceptors_sel.strip() if acceptors_sel is not None else acceptors_sel msg = ("{} is an empty selection string - no hydrogen bonds will " "be found. This may be intended, but please check your " @@ -393,10 +393,10 @@ def __init__(self, universe, self.results.hbonds = None # Set atom selections if they have not been provided - if self.acceptors_sel is None: - self.acceptors_sel = self.guess_acceptors() - if self.hydrogens_sel is None: - self.hydrogens_sel = self.guess_hydrogens() + if self._acceptors_sel is None: + self._acceptors_sel = self.guess_acceptors() + if self._hydrogens_sel is None: + self._hydrogens_sel = self.guess_hydrogens() # Select atom groups self._acceptors = self.u.select_atoms(self.acceptors_sel, @@ -984,3 +984,38 @@ def count_by_ids(self): unique_hbonds = unique_hbonds[unique_hbonds[:, 3].argsort()[::-1]] return unique_hbonds + + @property + def donors_sel(self): + """Selection string for the hydrogen bond donor atoms.""" + return self._donors_sel + + @donors_sel.setter + def donors_sel(self, value): + self._donors_sel = value + self._donors, self._hydrogens = self._get_dh_pairs() + + @property + def hydrogens_sel(self): + """Selection string for the hydrogen bond hydrogen atoms.""" + return self._hydrogens_sel + + @hydrogens_sel.setter + def hydrogens_sel(self, value): + self._hydrogens_sel = value + if self._hydrogens_sel is None: + self._hydrogens_sel = self.guess_hydrogens() + self._donors, self._hydrogens = self._get_dh_pairs() + + @property + def acceptors_sel(self): + """Selection string for the hydrogen bond acceptor atoms.""" + return self._acceptors_sel + + @acceptors_sel.setter + def acceptors_sel(self, value): + self._acceptors_sel = value + if self._acceptors_sel is None: + self._acceptors_sel = self.guess_acceptors() + self._acceptors = self.u.select_atoms(self._acceptors_sel, + updating=self.update_selections) \ No newline at end of file From e7fcd47f97d6f9bc71ab928218203f62be8b52a2 Mon Sep 17 00:00:00 2001 From: Yuxuan Zhuang Date: Tue, 8 Apr 2025 15:20:52 +0200 Subject: [PATCH 2/4] add test --- .../analysis/test_hydrogenbonds_analysis.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/testsuite/MDAnalysisTests/analysis/test_hydrogenbonds_analysis.py b/testsuite/MDAnalysisTests/analysis/test_hydrogenbonds_analysis.py index a731dd6ec9..2d70da9915 100644 --- a/testsuite/MDAnalysisTests/analysis/test_hydrogenbonds_analysis.py +++ b/testsuite/MDAnalysisTests/analysis/test_hydrogenbonds_analysis.py @@ -63,6 +63,22 @@ def h(self, universe, client_HydrogenBondAnalysis): h.run(**client_HydrogenBondAnalysis) return h + @pytest.fixture(scope="class") + def h_modified(self, universe, client_HydrogenBondAnalysis): + kwargs = self.kwargs.copy() + donors_sel = kwargs.pop("donors_sel") + hydrogens_sel = kwargs.pop("hydrogens_sel") + acceptors_sel = kwargs.pop("acceptors_sel") + h = HydrogenBondAnalysis(universe, **kwargs) + h.donors_sel = donors_sel + h.hydrogens_sel = hydrogens_sel + h.acceptors_sel = acceptors_sel + h.run(**client_HydrogenBondAnalysis) + return h + + def test_hbond_modified_consistency(self, h, h_modified): + assert_array_equal(h.results.hbonds, h_modified.results.hbonds) + def test_hbond_analysis(self, h): assert len(np.unique(h.results.hbonds[:, 0])) == 10 From f7205220269fb579ddeb886718bab35868c6a7d0 Mon Sep 17 00:00:00 2001 From: Yuxuan Zhuang Date: Tue, 8 Apr 2025 15:23:43 +0200 Subject: [PATCH 3/4] add changelog --- package/CHANGELOG | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index faeaf76b59..b8c98b23a5 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -14,12 +14,15 @@ The rules for this file: ------------------------------------------------------------------------------- -??/??/?? IAlibay, orbeckst, BHM-Bob +??/??/?? IAlibay, orbeckst, BHM-Bob, yuxuanzhuang * 2.10.0 Fixes + * Fixes bug in `analysis/hydrogenbonds.py`: `_donors` and `_hydrogens` + was not updated when the `acceptors_sel` and `hydrogens_sel` were provided + after initialization. (Issue #5010) * Fixes bug in `analysis/gnm.py`: `closeContactGNMAnalysis`: correct the `residue_index_map` generation when selection is not `protein`. (Issue #4924, PR #4961) From d901fbdea619b81411dbde70c3191b7f0a43dae4 Mon Sep 17 00:00:00 2001 From: Yuxuan Zhuang Date: Tue, 8 Apr 2025 15:30:21 +0200 Subject: [PATCH 4/4] add version changed --- package/CHANGELOG | 4 ++-- .../analysis/hydrogenbonds/hbond_analysis.py | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index b8c98b23a5..74c5db3aa6 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -21,8 +21,8 @@ The rules for this file: Fixes * Fixes bug in `analysis/hydrogenbonds.py`: `_donors` and `_hydrogens` - was not updated when the `acceptors_sel` and `hydrogens_sel` were provided - after initialization. (Issue #5010) + were not updated when the `acceptors_sel` and `hydrogens_sel` were provided + after initialization. (Issue #5010, PR #5018) * Fixes bug in `analysis/gnm.py`: `closeContactGNMAnalysis`: correct the `residue_index_map` generation when selection is not `protein`. (Issue #4924, PR #4961) diff --git a/package/MDAnalysis/analysis/hydrogenbonds/hbond_analysis.py b/package/MDAnalysis/analysis/hydrogenbonds/hbond_analysis.py index fecde62cd3..544bd6e4e1 100644 --- a/package/MDAnalysis/analysis/hydrogenbonds/hbond_analysis.py +++ b/package/MDAnalysis/analysis/hydrogenbonds/hbond_analysis.py @@ -345,6 +345,10 @@ def __init__(self, universe, .. versionchanged:: 2.8.0 Introduced :meth:`get_supported_backends` allowing for parallel execution on :mod:`multiprocessing` and :mod:`dask` backends. + .. versionchanged:: 2.10.0 + The `donors_sel`, `hydrogens_sel`, and `acceptors_sel` are stored as properties + now and update the internal `_donor`, `_hydrogens`, and `_acceptors` when they + are modified. """ self.u = universe @@ -987,7 +991,10 @@ def count_by_ids(self): @property def donors_sel(self): - """Selection string for the hydrogen bond donor atoms.""" + """Selection string for the hydrogen bond donor atoms. + + .. versionadded:: 2.10.0 + """ return self._donors_sel @donors_sel.setter @@ -997,7 +1004,10 @@ def donors_sel(self, value): @property def hydrogens_sel(self): - """Selection string for the hydrogen bond hydrogen atoms.""" + """Selection string for the hydrogen bond hydrogen atoms. + + .. versionadded:: 2.10.0 + """ return self._hydrogens_sel @hydrogens_sel.setter @@ -1009,7 +1019,10 @@ def hydrogens_sel(self, value): @property def acceptors_sel(self): - """Selection string for the hydrogen bond acceptor atoms.""" + """Selection string for the hydrogen bond acceptor atoms. + + .. versionadded:: 2.10.0 + """ return self._acceptors_sel @acceptors_sel.setter