Source code for openxps.bounds.circular

"""
Circular boundary condition.

.. module:: openxps.bounds.circular
   :platform: Linux, MacOS, Windows
   :synopsis: Circular boundary condition

.. classauthor:: Charlles Abreu <craabreu@gmail.com>

"""

import math

import numpy as np
from openmm import unit as mmunit

from .periodic import PeriodicBounds


[docs] class CircularBounds(PeriodicBounds): """ A circular boundary condition equivalent to PeriodicBounds(-π, π, radians). This is a convenience class for the common case of a periodic boundary condition spanning from -π to π radians, which corresponds to a full circle. Parameters ---------- lower, upper, unit Optional arguments for internal use (e.g., during deserialization). If not provided, defaults to -π, π, radians respectively. Example ------- >>> import openxps as xps >>> bounds = xps.bounds.CircularBounds() >>> bounds.lower == -3.141592653589793 True >>> bounds.upper == 3.141592653589793 True >>> bounds.unit == xps.bounds.CircularBounds().unit True >>> from openmm import unit >>> bounds.convert(unit.degree) CircularBounds(lower=-180.0, upper=180.0, unit=deg) """ def __init__( self, lower: float = -np.pi, upper: float = np.pi, unit: mmunit.Unit = mmunit.radians, ) -> None: super().__init__(lower, upper, unit) if not self.unit.is_compatible(mmunit.radians): raise ValueError("Circular bounds must have an angle unit.") factor = self.unit.conversion_factor_to(mmunit.radians) if not ( math.isclose(self.lower * factor, -np.pi, rel_tol=1e-9) and math.isclose(self.upper * factor, np.pi, rel_tol=1e-9) ): raise ValueError("Circular bounds must span from -π to π radians.")
CircularBounds.registerTag("!openxps.bounds.CircularBounds")