Skip to content
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
de9cd4c
added parallelization to WaterBridgeAnalysis
talagayev Nov 20, 2025
84c74d0
adjusted the test files for WB
talagayev Nov 25, 2025
666aabf
black formatting
talagayev Nov 26, 2025
946ec67
removed files that were moved
talagayev Nov 26, 2025
8db21b4
black formatting
talagayev Nov 26, 2025
3b4812f
fixed case when empty results with parallelization
talagayev Nov 26, 2025
dd2e21b
remove unused imports
marinegor Nov 26, 2025
6fab4c6
got back StringIO case for showcase
talagayev Nov 27, 2025
6708442
Merge branch 'develop' into wb_parallel
talagayev Nov 27, 2025
d6bdae9
Update test_wbridge.py
talagayev Nov 27, 2025
e10772c
Update conftest.py
talagayev Nov 27, 2025
fca6ca2
Update test_wbridge.py
talagayev Nov 27, 2025
844b237
Merge branch 'MDAnalysis:develop' into wb_parallel
talagayev Feb 2, 2026
d26ec16
suggested PR adjustment
talagayev Feb 2, 2026
7f06d51
modified test
talagayev Feb 2, 2026
a796920
Merge branch 'wb_parallel' of https://github.com/talagayev/mdanalysis…
talagayev Feb 2, 2026
412c682
modified test
talagayev Feb 2, 2026
49133c5
black formatting
talagayev Feb 2, 2026
200843c
black formatting
talagayev Feb 2, 2026
5871f5c
Update datafiles.py
talagayev Feb 3, 2026
cc63480
comments + black formatting
talagayev Feb 4, 2026
07fff26
removal of teststeps and use of times
talagayev Feb 11, 2026
3303da5
black format
talagayev Feb 11, 2026
4398e13
adjusted tests
talagayev Feb 11, 2026
b1d32ee
adjusted code
talagayev Feb 11, 2026
504cee5
added versionchanged
talagayev Feb 12, 2026
6dbee6c
added CHANGELOG entry
talagayev Feb 12, 2026
e18cb91
Merge branch 'develop' into wb_parallel
talagayev Feb 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 43 additions & 18 deletions package/MDAnalysis/analysis/hydrogenbonds/wbridge_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -716,7 +716,7 @@ def analysis(current, output, u, **kwargs):
from MDAnalysis.lib.distances import calc_angles, capped_distance
from MDAnalysis.lib.NeighborSearch import AtomNeighborSearch

from ..base import AnalysisBase
from ..base import AnalysisBase, ResultsGroup

logger = logging.getLogger("MDAnalysis.analysis.WaterBridgeAnalysis")

Expand Down Expand Up @@ -804,6 +804,16 @@ class WaterBridgeAnalysis(AnalysisBase):
lambda: 1.5, N=1.31, O=1.31, P=1.58, S=1.55 # default value
) # noqa: E741

_analysis_algorithm_is_parallelizable = True

@classmethod
def get_supported_backends(cls):
return (
"serial",
"multiprocessing",
"dask",
)

def __init__(
self,
universe,
Expand Down Expand Up @@ -1951,25 +1961,32 @@ def count_by_time(self, analysis_func=None, **kwargs):
"""
if analysis_func is None:
analysis_func = self._count_by_time_analysis
if self.results.network:
result = []
for time, frame in zip(self.timesteps, self.results.network):
result_dict = defaultdict(int)
self._traverse_water_network(
frame,
[],
analysis_func=analysis_func,
output=result_dict,
link_func=self._full_link,
**kwargs,
)
result.append(
(time, sum([result_dict[key] for key in result_dict]))
)
return result
else:

if not self.results.network:
return None

# --- simple fallback for missing timesteps ---
if self.timesteps is None:
timesteps = range(len(self.results.network))
else:
timesteps = self.timesteps
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be actual timesteps, and not integer indices. Solution would be to save them to results._timesteps and later use them where needed, while adding deprecation warning to self.timesteps alike InterRDS_s's approach.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

adjusted the code to use more results._timesteps. @marinegor could you take a look if it is correct now? :)


result = []
for time, frame in zip(timesteps, self.results.network):
result_dict = defaultdict(int)
self._traverse_water_network(
frame,
[],
analysis_func=analysis_func,
output=result_dict,
link_func=self._full_link,
**kwargs,
)
result.append(
(time, sum([result_dict[key] for key in result_dict]))
)
return result

def _timesteps_by_type_analysis(self, current, output, *args, **kwargs):
s1_index, to_index, s1, to_residue, dist, angle = (
self._expand_timeseries(current[0])
Expand Down Expand Up @@ -2152,6 +2169,14 @@ def generate_table(self, output_format=None):
def _conclude(self):
self.results.timeseries = self._generate_timeseries()

def _get_aggregator(self):
return ResultsGroup(
lookup={
"timeseries": ResultsGroup.ndarray_hstack, # Get positions
"network": ResultsGroup.ndarray_hstack, # Get positions
}
)

@property
def network(self):
wmsg = (
Expand Down
11 changes: 11 additions & 0 deletions testsuite/MDAnalysisTests/analysis/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
from MDAnalysis.analysis.hydrogenbonds.hbond_analysis import (
HydrogenBondAnalysis,
)
from MDAnalysis.analysis.hydrogenbonds.wbridge_analysis import (
WaterBridgeAnalysis,
)
from MDAnalysis.analysis.nucleicacids import NucPairDist
from MDAnalysis.analysis.contacts import Contacts
from MDAnalysis.analysis.density import DensityAnalysis
Expand Down Expand Up @@ -217,3 +220,11 @@ def client_InterRDF_s(request):
@pytest.fixture(scope="module", params=params_for_cls(DistanceMatrix))
def client_DistanceMatrix(request):
return request.param


# MDAnalysis.analysis.hydrogenbonds.wbridge_analysis
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can remove, but would it not better to keep it for consistency with the other functions, that are also commented in that way like here:

https://github.com/talagayev/mdanalysis/blob/5871f5c876bc873c19f9fc8c9694e40c1f2021a7/testsuite/MDAnalysisTests/analysis/conftest.py#L217-L222

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would keep for consistency.



@pytest.fixture(scope="module", params=params_for_cls(WaterBridgeAnalysis))
def client_WaterBridgeAnalysis(request):
return request.param
Loading
Loading