Source code for qmmm_pme.plugins.rigid.rigid

#! /usr/bin/env python3
"""A module defining the pluggable implementation of the rigid bodies
algorithm for the |package| repository.
"""
from __future__ import annotations

from typing import Callable
from typing import TYPE_CHECKING

import numpy as np
from numpy.typing import NDArray

from qmmm_pme.plugins.plugin import IntegratorPlugin

if TYPE_CHECKING:
    from qmmm_pme.integrators.integrator import ModifiableIntegrator


[docs]class Stationary(IntegratorPlugin): """A :class:`Plugin` which implements stationary residues during simulation. :param stationary_residues: The names of residues to hold stationary in the :class:`System`. """ def __init__( self, stationary_residues: list[str], ) -> None: self.stationary_residues = stationary_residues
[docs] def modify( self, integrator: ModifiableIntegrator, ) -> None: self._modifieds.append(type(integrator).__name__) self.system = integrator.system self.residues = [ res for i, res in enumerate(self.system.topology.mm_atoms()) if self.system.topology.residue_names()[i] in self.stationary_residues ] integrator.integrate = self._modify_integrate( integrator.integrate, ) integrator.compute_velocities = self._modify_compute_velocities( integrator.compute_velocities, )
def _modify_integrate( self, integrate: Callable[ [], tuple[ NDArray[np.float64], NDArray[np.float64], ], ], ) -> Callable[[], tuple[NDArray[np.float64], NDArray[np.float64]]]: """Modify the integrate call in the :class:`Integrator` to make the positions of a subset of residues constant and their velocities zero. :param integrate: The default integrate method of the :class:`Integrator`. :return: The modified integrate method. """ def inner() -> tuple[NDArray[np.float64], NDArray[np.float64]]: positions, velocities = integrate() positions[self.residues, :] = self.system.state.positions( )[self.residues, :] velocities[self.residues, :] = 0 return positions, velocities return inner def _modify_compute_velocities( self, compute_velocities: Callable[[], NDArray[np.float64]], ) -> Callable[[], NDArray[np.float64]]: """Modify the compute_velocities call in the :class:`Integrator` to make the velocities of a subset of residues zero. :param compute_velocities: The default compute_velocities method of the :class:`Integrator`. :return: The modified compute_velocities method. """ def inner() -> NDArray[np.float64]: velocities = compute_velocities() velocities[self.residues, :] = 0 return velocities return inner
[docs]class RigidBody(IntegratorPlugin): """A :class:`Plugin` which implements rigid body dynamics during simulation. """ def __init__(self) -> None: raise NotImplementedError
[docs] def modify( self, integrator: ModifiableIntegrator, ) -> None: pass