Source code for molecular_simulations.utils.mda_utils
from pathlib import Path
import MDAnalysis as mda
import numpy as np
from rust_simulation_tools import kabsch_align # ty: ignore[unresolved-import]
[docs]
def trim_trajectory(
u: mda.Universe,
out: Path,
stride: int = 1,
align: bool = False,
rewrap: bool = False,
sel: str | None = None,
align_sel: str | None = None,
) -> None:
selection = u.select_atoms(sel) if sel is not None else u.atoms
assert selection is not None
positions = np.zeros(
(u.trajectory.n_frames // stride, selection.n_atoms, 3), dtype=np.float32
)
for i, _ in enumerate(u.trajectory[::stride]):
positions[i, ...] = selection.positions.copy().astype(np.float32)
if align:
if align_sel is None:
align_idx = selection.select_atoms('backbone or nucleicbackbone').ix
else:
align_idx = selection.select_atoms(align_sel).ix
positions = kabsch_align(positions, positions[0], align_idx)
if rewrap:
pass
with mda.Writer(str(out), n_atoms=selection.n_atoms) as w:
for pos in positions:
w.write(pos)