Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
1 change: 1 addition & 0 deletions package/AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ Chronological list of authors
- Raúl Lois-Cuns
- Pranay Pelapkar
- Shreejan Dolai
- Pardhav Maradani

External code
-------------
Expand Down
5 changes: 4 additions & 1 deletion package/CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ The rules for this file:

-------------------------------------------------------------------------------
??/??/?? IAlibay, orbeckst, marinegor, tylerjereddy, ljwoods2, marinegor,
spyke7, talagayev
spyke7, talagayev, PardhavMaradani

* 2.11.0

Expand All @@ -32,6 +32,9 @@ Fixes
Enhancements
* Enables parallelization for analysis.diffusionmap.DistanceMatrix
(Issue #4679, PR #4745)
* Added a current frame iterator `StreamFrameIteratorCurrent` for streamed
trajectories to enable `AnalysisBase.run` on per-frame streamed data
(Issue #5183, PR #5184)

Changes
* The msd.py inside analysis is changed, and ProgressBar is implemented inside
Expand Down
52 changes: 49 additions & 3 deletions package/MDAnalysis/coordinates/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@

.. autoclass:: StreamFrameIteratorSliced

.. autoclass:: StreamFrameIteratorCurrent

.. _ReadersBase:

Readers
Expand Down Expand Up @@ -1882,10 +1884,11 @@ class StreamReaderBase(ReaderBase):
See Also
--------
StreamFrameIteratorSliced : Iterator for stepped streaming access
StreamFrameIteratorCurrent : Iterator for current frame streaming access
ReaderBase : Base class for standard trajectory readers


.. versionadded:: 2.10.0
.. versionadded:: 2.10.0
"""

def __init__(self, filename, convert_units=True, **kwargs):
Expand Down Expand Up @@ -2040,7 +2043,7 @@ def __getitem__(self, frame):

Returns
-------
FrameIteratorAll or StreamFrameIteratorSliced
FrameIteratorAll or StreamFrameIteratorSliced or StreamFrameIteratorCurrent
Iterator for the requested slice.

Raises
Expand All @@ -2060,6 +2063,7 @@ def __getitem__(self, frame):
See Also
--------
StreamFrameIteratorSliced
StreamFrameIteratorCurrent
"""
if isinstance(frame, slice):
_, _, step = self.check_slice_indices(
Expand All @@ -2069,6 +2073,13 @@ def __getitem__(self, frame):
return FrameIteratorAll(self)
else:
return StreamFrameIteratorSliced(self, step)
elif isinstance(frame, (list, np.ndarray)):
if len(frame) == 1 and frame[0] == self.trajectory.frame:
return StreamFrameIteratorCurrent(self)
else:
raise ValueError(
"Streamed trajectories must have single current frame value"
)
else:
raise TypeError(
"Streamed trajectories must be an indexed using a slice"
Expand Down Expand Up @@ -2310,4 +2321,39 @@ def step(self):
Step size for iteration. Always a positive integer greater than 0.

"""
return self._step
return self._step


class StreamFrameIteratorCurrent(FrameIteratorBase):
"""Iterator for current frame access in a streamed trajectory.

Created when an array with a single current frame value is passed.

Parameters
----------
trajectory : StreamReaderBase
The streaming trajectory reader to iterate over. Must be a
stream-based reader that supports continuous data reading.

See Also
--------
StreamReaderBase
FrameIteratorBase

.. versionadded:: 2.11.0
"""

def __init__(self, trajectory):
super(StreamFrameIteratorCurrent, self).__init__(trajectory)

def __len__(self):
return 1

def __iter__(self):
yield self.trajectory._read_frame_with_aux(self.trajectory.frame)

def __next__(self):
raise StopIteration from None

def __getitem__(self, frame):
raise RuntimeError("Current frame iterator does not support indexing")
9 changes: 9 additions & 0 deletions testsuite/MDAnalysisTests/coordinates/test_imd.py
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,15 @@ def test_step_property(self, reader):
sliced_reader_step5 = reader[::5]
assert sliced_reader_step5.step == 5

def test_iterate_current_frame_raises_error(self, reader):
with pytest.raises(ValueError, match="must have single current frame value"):
for ts in reader[[1]]:
pass

def test_iterate_current_frame(self, reader):
for ts in reader[[reader.frame]]:
assert ts.frame == reader.frame


@pytest.mark.skipif(not HAS_IMDCLIENT, reason="IMDClient not installed")
def test_n_atoms_not_specified(universe, imdsinfo):
Expand Down
Loading