Coverage for dynasor / trajectory / ase_trajectory_reader.py: 100%
22 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-16 12:31 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-16 12:31 +0000
1from itertools import count
2from typing import Optional
3import numpy as np
4from ase import io
5from dynasor.trajectory.abstract_trajectory_reader import AbstractTrajectoryReader
6from dynasor.trajectory.trajectory_frame import ReaderFrame
9class ASETrajectoryReader(AbstractTrajectoryReader):
10 """Read ASE trajectory file
12 ...
14 Parameters
15 ----------
16 filename
17 Name of input file.
18 length_unit
19 Unit of length for the input trajectory (``'Angstrom'``, ``'nm'``, ``'pm'``, ``'fm'``).
20 time_unit
21 Unit of time for the input trajectory (``'fs'``, ``'ps'``, ``'ns'``).
22 """
24 def __init__(
25 self,
26 filename: str,
27 length_unit: Optional[str] = 'Angstrom',
28 time_unit: Optional[str] = 'fs',
29 ):
30 self._frame_index = count(0)
31 self._atoms = io.iread(filename, index=':')
33 # setup units
34 self.set_unit_scaling_factors(length_unit, time_unit)
36 def __iter__(self):
37 return self
39 def close(self):
40 pass
42 def __next__(self):
43 ind = next(self._frame_index)
44 a = next(self._atoms)
45 if 'momenta' in a.arrays:
46 vel = self.v_factor * a.get_velocities()
47 else:
48 vel = None
49 return ReaderFrame(
50 frame_index=ind,
51 n_atoms=len(a),
52 cell=self.x_factor * a.cell.array.copy('F'),
53 positions=self.x_factor * a.get_positions(),
54 velocities=vel,
55 atom_types=np.array(list(a.symbols)),
56 )