Source code for mdtraj.utils
from __future__ import print_function, division
import time
from mdtraj.utils.delay_import import import_
from mdtraj.utils.arrays import ensure_type, cast_indices
from mdtraj.utils.unit import in_units_of
from mdtraj.utils.unitcell import (lengths_and_angles_to_box_vectors,
box_vectors_to_lengths_and_angles)
__all__ = ["ensure_type", "import_", "in_units_of",
"lengths_and_angles_to_box_vectors", "box_vectors_to_lengths_and_angles",
"ilen", "timing", "cast_indices", "convert"]
def convert(quantity, in_unit, out_unit, inplace=False):
"""Convert between distance units. Note, inplace==True won't
work unless the quantity is a numpy array. This is a simple
version that doesn't require any external imports.
"""
if quantity is None:
return None
factor = {('angstroms', 'angstroms'): 1,
('nanometers', 'nanometers'): 1,
('angstroms', 'nanometers'): 0.1,
('nanometers', 'angstroms'): 10}[(in_unit, out_unit)]
if not inplace:
return quantity * factor
quantity *= factor
[docs]def ilen(iterable):
"""Length of an iterator. Note, this consumes the iterator
Parameters
----------
iterable : iterable
An iterable, such as a generator, list, etc.
Returns
-------
length : int
The number of elements in the iterable
"""
return sum(1 for _ in iterable)
[docs]class timing(object):
"""A timing context manager
Example
-------
>>> long_function = lambda : None
>>> with timing('long_function'):
... long_function()
long_function: 0.000 seconds
"""
[docs] def __init__(self, name='block'):
self.name = name
self.time = 0
self.start = None
self.end = None
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, ty, val, tb):
self.end = time.time()
self.time = self.end - self.start
print("%s: %0.3f seconds" % (self.name, self.time))
return False