Skip to content

Commit 740332c

Browse files
yuxuanzhuangIAlibayorbeckst
authored
Update _donor, _hydrogens, and _acceptors AtomGroups in HBondAnalysis whenever the selection strings are changed. (#5018)
- add sel as property and update ag when changed - add test and changelog - fix #5010 --------- Co-authored-by: Irfan Alibay <IAlibay@users.noreply.github.com> Co-authored-by: Oliver Beckstein <orbeckst@gmail.com>
1 parent 089f49e commit 740332c

File tree

3 files changed

+76
-8
lines changed

3 files changed

+76
-8
lines changed

package/CHANGELOG

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@ The rules for this file:
1414

1515

1616
-------------------------------------------------------------------------------
17-
??/??/?? IAlibay, orbeckst, BHM-Bob, TRY-ER, Abdulrahman-PROG, pbuslaev
17+
??/??/?? IAlibay, orbeckst, BHM-Bob, TRY-ER, Abdulrahman-PROG, pbuslaev,
18+
yuxuanzhuang
1819

1920
* 2.10.0
2021

2122
Fixes
23+
* Fixes bug in `analysis/hydrogenbonds.py`: `_donors` and `_hydrogens`
24+
were not updated when the `acceptors_sel` and `hydrogens_sel` were provided
25+
after initialization. (Issue #5010, PR #5018)
2226
* Fixes bug in `analysis/gnm.py`: `closeContactGNMAnalysis`: correct the
2327
`residue_index_map` generation when selection is not `protein`.
2428
(Issue #4924, PR #4961)

package/MDAnalysis/analysis/hydrogenbonds/hbond_analysis.py

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -345,14 +345,18 @@ def __init__(self, universe,
345345
.. versionchanged:: 2.8.0
346346
Introduced :meth:`get_supported_backends` allowing for parallel execution on
347347
:mod:`multiprocessing` and :mod:`dask` backends.
348+
.. versionchanged:: 2.10.0
349+
The `donors_sel`, `hydrogens_sel`, and `acceptors_sel` are stored as properties
350+
now and update the internal `_donor`, `_hydrogens`, and `_acceptors` when they
351+
are modified.
348352
"""
349353

350354
self.u = universe
351355
self._trajectory = self.u.trajectory
352356

353-
self.donors_sel = donors_sel.strip() if donors_sel is not None else donors_sel
354-
self.hydrogens_sel = hydrogens_sel.strip() if hydrogens_sel is not None else hydrogens_sel
355-
self.acceptors_sel = acceptors_sel.strip() if acceptors_sel is not None else acceptors_sel
357+
self._donors_sel = donors_sel.strip() if donors_sel is not None else donors_sel
358+
self._hydrogens_sel = hydrogens_sel.strip() if hydrogens_sel is not None else hydrogens_sel
359+
self._acceptors_sel = acceptors_sel.strip() if acceptors_sel is not None else acceptors_sel
356360

357361
msg = ("{} is an empty selection string - no hydrogen bonds will "
358362
"be found. This may be intended, but please check your "
@@ -393,10 +397,10 @@ def __init__(self, universe,
393397
self.results.hbonds = None
394398

395399
# Set atom selections if they have not been provided
396-
if self.acceptors_sel is None:
397-
self.acceptors_sel = self.guess_acceptors()
398-
if self.hydrogens_sel is None:
399-
self.hydrogens_sel = self.guess_hydrogens()
400+
if self._acceptors_sel is None:
401+
self._acceptors_sel = self.guess_acceptors()
402+
if self._hydrogens_sel is None:
403+
self._hydrogens_sel = self.guess_hydrogens()
400404

401405
# Select atom groups
402406
self._acceptors = self.u.select_atoms(self.acceptors_sel,
@@ -984,3 +988,47 @@ def count_by_ids(self):
984988
unique_hbonds = unique_hbonds[unique_hbonds[:, 3].argsort()[::-1]]
985989

986990
return unique_hbonds
991+
992+
@property
993+
def donors_sel(self):
994+
"""Selection string for the hydrogen bond donor atoms.
995+
996+
.. versionadded:: 2.10.0
997+
"""
998+
return self._donors_sel
999+
1000+
@donors_sel.setter
1001+
def donors_sel(self, value):
1002+
self._donors_sel = value
1003+
self._donors, self._hydrogens = self._get_dh_pairs()
1004+
1005+
@property
1006+
def hydrogens_sel(self):
1007+
"""Selection string for the hydrogen bond hydrogen atoms.
1008+
1009+
.. versionadded:: 2.10.0
1010+
"""
1011+
return self._hydrogens_sel
1012+
1013+
@hydrogens_sel.setter
1014+
def hydrogens_sel(self, value):
1015+
self._hydrogens_sel = value
1016+
if self._hydrogens_sel is None:
1017+
self._hydrogens_sel = self.guess_hydrogens()
1018+
self._donors, self._hydrogens = self._get_dh_pairs()
1019+
1020+
@property
1021+
def acceptors_sel(self):
1022+
"""Selection string for the hydrogen bond acceptor atoms.
1023+
1024+
.. versionadded:: 2.10.0
1025+
"""
1026+
return self._acceptors_sel
1027+
1028+
@acceptors_sel.setter
1029+
def acceptors_sel(self, value):
1030+
self._acceptors_sel = value
1031+
if self._acceptors_sel is None:
1032+
self._acceptors_sel = self.guess_acceptors()
1033+
self._acceptors = self.u.select_atoms(self._acceptors_sel,
1034+
updating=self.update_selections)

testsuite/MDAnalysisTests/analysis/test_hydrogenbonds_analysis.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,22 @@ def h(self, universe, client_HydrogenBondAnalysis):
6363
h.run(**client_HydrogenBondAnalysis)
6464
return h
6565

66+
@pytest.fixture(scope="class")
67+
def h_modified(self, universe, client_HydrogenBondAnalysis):
68+
kwargs = self.kwargs.copy()
69+
donors_sel = kwargs.pop("donors_sel")
70+
hydrogens_sel = kwargs.pop("hydrogens_sel")
71+
acceptors_sel = kwargs.pop("acceptors_sel")
72+
h = HydrogenBondAnalysis(universe, **kwargs)
73+
h.donors_sel = donors_sel
74+
h.hydrogens_sel = hydrogens_sel
75+
h.acceptors_sel = acceptors_sel
76+
h.run(**client_HydrogenBondAnalysis)
77+
return h
78+
79+
def test_hbond_modified_consistency(self, h, h_modified):
80+
assert_array_equal(h.results.hbonds, h_modified.results.hbonds)
81+
6682
def test_hbond_analysis(self, h):
6783

6884
assert len(np.unique(h.results.hbonds[:, 0])) == 10

0 commit comments

Comments
 (0)