Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Transformation to set box dimensions #3175

Merged
merged 49 commits into from
Apr 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
cf48a57
add boxdimensions.py
hp115 Mar 16, 2021
d63aca2
write .gitignore
hp115 Mar 16, 2021
8488cfd
add tests for boxdimensions transformation
hp115 Mar 16, 2021
09276f5
update .gitignore
hp115 Mar 16, 2021
3f3d1e7
change naming of dimensions setting class to SetDimensions
hp115 Mar 16, 2021
97e5d43
add changes to CHANGELOG
hp115 Mar 16, 2021
f115d54
Delete .gitignore
hp115 Mar 16, 2021
0beee17
Update boxdimensions.py
hp115 Mar 19, 2021
7b9a364
Update boxdimensions.py
hp115 Mar 19, 2021
64cc339
Update boxdimensions.py
hp115 Mar 19, 2021
0d95061
Update boxdimensions.py
hp115 Mar 19, 2021
552a7a4
Update boxdimensions.py
hp115 Mar 19, 2021
dfabf94
Update test_boxdimensions.py
hp115 Mar 19, 2021
5ef27c8
Update boxdimensions.py
hp115 Mar 19, 2021
4d3cf17
Update package/MDAnalysis/transformations/boxdimensions.py
hp115 Mar 29, 2021
6ce9ab1
Update testsuite/MDAnalysisTests/transformations/test_boxdimensions.py
hp115 Mar 29, 2021
4408a09
Update boxdimensions.py
hp115 Mar 29, 2021
e33499e
Update test_boxdimensions.py
hp115 Mar 29, 2021
5281cb1
Update __init__.py
hp115 Mar 29, 2021
835283c
Update CHANGELOG
hp115 Mar 29, 2021
7cc725b
Add boxdimensions.rst to documentation_pages
hp115 Mar 29, 2021
e6b3109
Delete boxdimensions.rst
hp115 Mar 29, 2021
ded63d3
Update boxdimensions.py
hp115 Mar 29, 2021
100e3e4
Update test_boxdimensions.py
hp115 Mar 29, 2021
7d0fed3
Update test_boxdimensions.py
hp115 Apr 5, 2021
73d1a0b
Add boxdimensions.rst to documentation_pages
hp115 Apr 5, 2021
ffae4f4
Update boxdimensions.rst
hp115 Apr 5, 2021
6274d88
Update boxdimensions.py
hp115 Apr 5, 2021
a823c23
Update test_boxdimensions.py
hp115 Apr 5, 2021
a2c41e9
Merge branch 'develop' into issue-2691-set-box-dimensions
IAlibay Apr 5, 2021
d406e3c
Update package/MDAnalysis/transformations/boxdimensions.py
hp115 Apr 5, 2021
53369ad
Update test_boxdimensions.py
hp115 Apr 5, 2021
f2cbf8f
Update boxdimensions.py
hp115 Apr 5, 2021
2d908ae
Update package/MDAnalysis/transformations/boxdimensions.py
hp115 Apr 5, 2021
669acf2
Update package/MDAnalysis/transformations/boxdimensions.py
hp115 Apr 5, 2021
3c3e350
Create boxdimensions.py
hp115 Apr 5, 2021
d485bce
Update __init__.py
hp115 Apr 5, 2021
47b874f
Update CHANGELOG
hp115 Apr 5, 2021
fa1d031
Update trajectory_transformations.rst
hp115 Apr 5, 2021
3593369
Update test_boxdimensions.py
hp115 Apr 5, 2021
00f6116
Merge branch 'develop' into issue-2691-set-box-dimensions
lilyminium Apr 5, 2021
31d6202
Update package/MDAnalysis/transformations/boxdimensions.py
hp115 Apr 6, 2021
ab037d9
Update test_boxdimensions.py
hp115 Apr 6, 2021
c8a0225
Update test_boxdimensions.py
hp115 Apr 6, 2021
aa75ced
Update test_boxdimensions.py
hp115 Apr 6, 2021
6eb75b4
Update package/MDAnalysis/transformations/boxdimensions.py
hp115 Apr 6, 2021
a3bfd0d
Update package/MDAnalysis/transformations/boxdimensions.py
hp115 Apr 6, 2021
c50c604
Update AUTHORS
hp115 Apr 6, 2021
6b61a59
Merge branch 'develop' into issue-2691-set-box-dimensions
lilyminium Apr 6, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package/AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ Chronological list of authors
- Jan Stevens
- Orion Cohen
- Dimitrios Papageorgiou
- Hannah Pollak

External code
-------------
Expand Down
4 changes: 3 additions & 1 deletion package/CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ The rules for this file:
lilyminium, daveminh, jbarnoud, yuxuanzhuang, VOD555, ianmkenney,
calcraven,xiki-tempula, mieczyslaw, manuel.nuno.melo, PicoCentauri,
hanatok, rmeli, aditya-kamath, tirkarthi, LeonardoBarneschi, hejamu,
biogen98, orioncohen, z3y50n
biogen98, orioncohen, z3y50n, hp115

* 2.0.0

Expand Down Expand Up @@ -89,6 +89,8 @@ Fixes
* Fix syntax warning over comparison of literals using is (Issue #3066)

Enhancements
* Add `set_dimensions` transformation class for setting constant
box dimensions for all timesteps in trajectory (Issue #2691)
* Added a ValueError raised when not given a gridcenter while
providing grid dimensions to DensityAnalysis, also added
check for NaN in the input (Issue #3148, PR #3154)
Expand Down
1 change: 1 addition & 0 deletions package/MDAnalysis/transformations/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,4 @@ def wrapped(ts):
from .positionaveraging import PositionAverager
from .fit import fit_translation, fit_rot_trans
from .wrap import wrap, unwrap
from .boxdimensions import set_dimensions
87 changes: 87 additions & 0 deletions package/MDAnalysis/transformations/boxdimensions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*-
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
#
# MDAnalysis --- https://www.mdanalysis.org
# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors
# (see the file AUTHORS for the full list of names)
#
# Released under the GNU Public Licence, v2 or any higher version
#
# Please cite your use of MDAnalysis in published work:
#
# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler,
# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein.
# MDAnalysis: A Python package for the rapid analysis of molecular dynamics
# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th
# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy.
# doi: 10.25080/majora-629e541a-00e
#
# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein.
# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations.
# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787
#

"""\
Set box dimensions --- :mod:`MDAnalysis.transformations.boxdimensions`
=======================================================================

Set dimensions of the simulation box to a constant vector across all timesteps.


.. autoclass:: set_dimensions
"""
import numpy as np


class set_dimensions:
"""
Set simulation box dimensions.

Timestep dimensions are modified in place.

Example
-------

e.g. set simulation box dimensions to a vector containing unit cell
dimensions [*a*, *b*, *c*, *alpha*, *beta*, *gamma*], lengths *a*,
*b*, *c* are in the MDAnalysis length unit (Å), and angles are in degrees.

.. code-block:: python

dim = [2, 2, 2, 90, 90, 90]
transform = mda.transformations.boxdimensions.set_dimensions(dim)
u.trajectory.add_transformations(transform)

Parameters
----------
dimensions: iterable of floats
vector that contains unit cell lengths and angles.
Expected shapes are (6, 0) or (1, 6)

Returns
-------
:class:`~MDAnalysis.coordinates.base.Timestep` object
"""

def __init__(self, dimensions):
self.dimensions = dimensions

try:
self.dimensions = np.asarray(self.dimensions, np.float32)
except ValueError:
errmsg = (f'{self.dimensions} cannot be converted into '
'np.float32 numpy.ndarray')
raise ValueError(errmsg)
try:
self.dimensions = self.dimensions.reshape(6, )
except ValueError:
errmsg = (f'{self.dimensions} array does not have valid box '
hp115 marked this conversation as resolved.
Show resolved Hide resolved
'dimension shape.\nSimulation box dimensions are '
'given by an float array of shape (6, ), '
' containing 3 lengths and 3 angles: '
'[a, b, c, alpha, beta, gamma]')
raise ValueError(errmsg)

def __call__(self, ts):
ts.dimensions = self.dimensions
return ts
Original file line number Diff line number Diff line change
Expand Up @@ -233,4 +233,5 @@ Currently implemented transformations
./transformations/positionaveraging
./transformations/fit
./transformations/wrap
./transformations/boxdimensions

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.. automodule:: MDAnalysis.transformations.boxdimensions
hp115 marked this conversation as resolved.
Show resolved Hide resolved
83 changes: 83 additions & 0 deletions testsuite/MDAnalysisTests/transformations/test_boxdimensions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*-
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8
#
# MDAnalysis --- https://www.mdanalysis.org
# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors
# (see the file AUTHORS for the full list of names)
#
# Released under the GNU Public Licence, v2 or any higher version
#
# Please cite your use of MDAnalysis in published work:
#
# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler,
# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein.
# MDAnalysis: A Python package for the rapid analysis of molecular dynamics
# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th
# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy.
# doi: 10.25080/majora-629e541a-00e
#
# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein.
# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations.
# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787
#

import numpy as np
import pytest
from numpy.testing import assert_array_almost_equal

import MDAnalysis as mdanalysis
from MDAnalysis.transformations import set_dimensions
from MDAnalysisTests import make_Universe


@pytest.fixture()
def boxdimensions_universe():
# create Universe objects for tests
new_u = make_Universe(trajectory=True)
return new_u


def test_boxdimensions_dims(boxdimensions_universe):
new_dims = np.float32([2, 2, 2, 90, 90, 90])
set_dimensions(new_dims)(boxdimensions_universe.trajectory.ts)
assert_array_almost_equal(boxdimensions_universe.dimensions,
new_dims, decimal=6)


@pytest.mark.parametrize('dim_vector_shapes', (
[1, 1, 1, 90, 90],
[1, 1, 1, 1, 90, 90, 90],
np.array([[1], [1], [90], [90], [90]]),
np.array([1, 1, 1, 90, 90]),
np.array([1, 1, 1, 1, 90, 90, 90]),
[1, 1, 1, 90, 90],
111909090)
)
def test_dimensions_vector(boxdimensions_universe, dim_vector_shapes):
# wrong box dimension vector shape
ts = boxdimensions_universe.trajectory.ts
with pytest.raises(ValueError, match='valid box dimension shape'):
set_dimensions(dim_vector_shapes)(ts)


@pytest.mark.parametrize('dim_vector_forms_dtypes', (
['a', 'b', 'c', 'd', 'e', 'f'],
np.array(['a', 'b', 'c', 'd', 'e', 'f']),
'abcd')
)
def test_dimensions_vector_asarray(boxdimensions_universe,
dim_vector_forms_dtypes):
# box dimension input type not convertible into array
ts = boxdimensions_universe.trajectory.ts
with pytest.raises(ValueError, match='cannot be converted'):
set_dimensions(dim_vector_forms_dtypes)(ts)


def test_dimensions_transformations_api(boxdimensions_universe):
# test if transformation works with on-the-fly transformations API
new_dims = np.float32([2, 2, 2, 90, 90, 90])
transform = set_dimensions(new_dims)
boxdimensions_universe.trajectory.add_transformations(transform)
for ts in boxdimensions_universe.trajectory:
assert_array_almost_equal(boxdimensions_universe.dimensions,
new_dims, decimal=6)