Source code for openff.units.units
"""
Core classes for OpenFF Units
"""
import uuid
import warnings
from typing import TYPE_CHECKING
import pint
from openff.utilities import requires_package
from pint import Measurement as _Measurement
from pint import Quantity as _Quantity
from pint import Unit as _Unit
from pint import UnitRegistry as _UnitRegistry
from openff.units.utilities import get_defaults_path
if TYPE_CHECKING:
from openmm.unit import Quantity as OpenMMQuantity
__all__ = [
"DEFAULT_UNIT_REGISTRY",
"Quantity",
"Measurement",
"Unit",
]
class Unit(_Unit):
"""A unit of measure."""
pass
class Quantity(_Quantity):
"""A value with associated units."""
def __dask_tokenize__(self):
return uuid.uuid4().hex
@staticmethod
def _dask_finalize(results, func, args, units):
values = func(results, *args)
return Quantity(values, units)
[docs] @requires_package("openmm")
def to_openmm(self) -> "OpenMMQuantity":
"""Convert the quantity to an ``openmm.unit.Quantity``.
Returns
-------
openmm_quantity : openmm.unit.quantity.Quantity
The OpenMM compatible quantity.
"""
from openff.units.openmm import to_openmm
return to_openmm(self)
class Measurement(_Measurement):
"""A value with associated units and uncertainty."""
def __dask_tokenize__(self):
return uuid.uuid4().hex
@staticmethod
def _dask_finalize(results, func, args, units):
values = func(results, *args)
return Measurement(values, units)
class UnitRegistry(_UnitRegistry):
_quantity_class = Quantity
_unit_class = Unit
_measurement_class = Measurement
DEFAULT_UNIT_REGISTRY = UnitRegistry(get_defaults_path())
Unit: _Unit = DEFAULT_UNIT_REGISTRY.Unit # type: ignore[no-redef]
Quantity: _Quantity = DEFAULT_UNIT_REGISTRY.Quantity # type: ignore[no-redef]
Measurement: _Measurement = DEFAULT_UNIT_REGISTRY.Measurement # type: ignore[no-redef]
pint.set_application_registry(DEFAULT_UNIT_REGISTRY)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
Quantity([])