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 14 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
2 changes: 2 additions & 0 deletions package/CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ Fixes
* Fix syntax warning over comparison of literals using is (Issue #3066)

Enhancements
* Introduce possibility for setting box dimensions for all timesteps in
hp115 marked this conversation as resolved.
Show resolved Hide resolved
trajectory (Issue #2691)
* Adds preliminary support for the ppc64le platform with minimal
dependencies (Issue #3127, PR #3149)
* Caches can now undergo central validation at the Universe level, opening
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 SetDimensions
78 changes: 78 additions & 0 deletions package/MDAnalysis/transformations/boxdimensions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# -*- 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`
hp115 marked this conversation as resolved.
Show resolved Hide resolved
hp115 marked this conversation as resolved.
Show resolved Hide resolved
=======================================================================

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


..autocalss:: setdimensions
hp115 marked this conversation as resolved.
Show resolved Hide resolved
"""
import numpy as np


class SetDimensions:
"""
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.

dim = [2, 2, 2, 90, 90, 90]
hp115 marked this conversation as resolved.
Show resolved Hide resolved
transform = mda.transformations.boxdimensions.setdimensions(dim)
hp115 marked this conversation as resolved.
Show resolved Hide resolved
u.trajectory.add_transformations(transform)

Parameters
----------
dimensions: array-like
hp115 marked this conversation as resolved.
Show resolved Hide resolved
vector that contains unit cell lengths and angles.
Expected shapes are (6, 0) or (1, 6)

Returns
-------
MDAnalysis.coordinates.base.Timestep
hp115 marked this conversation as resolved.
Show resolved Hide resolved
"""

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

try:
self.dimensions = np.asarray(self.dimensions, np.float32)
if self.dimensions.shape != (6, ) and \
self.dimensions.shape != (1, 6):
raise ValueError(f'{self.dimensions} are not valid box dimensions')
self.dimensions = self.dimensions.reshape(6, )
except ValueError:
raise ValueError(f'{self.dimensions} are not valid box dimensions')
hp115 marked this conversation as resolved.
Show resolved Hide resolved

def __call__(self, ts):
ts.dimensions = self.dimensions
return ts
77 changes: 77 additions & 0 deletions testsuite/MDAnalysisTests/transformations/test_boxdimensions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#-*- 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 SetDimensions
from MDAnalysisTests import make_Universe


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


def test_boxdimensions_dims(boxdimensions_universes):
ref_u, new_u = boxdimensions_universes
ref = ref_u.trajectory.ts
new_dims = np.float32([2, 2, 2, 90, 90, 90])
ref.dimensions = new_dims
new = SetDimensions(new_dims)(new_u.trajectory.ts)
assert_array_almost_equal(ref.dimensions, new.dimensions, decimal=6)
hp115 marked this conversation as resolved.
Show resolved Hide resolved


@pytest.mark.parametrize('dim_vector', (
[1, 1, 1, 90, 90],
[1, 1, 1, 1, 90, 90, 90],
['a', 'b', 'c', 'd', 'e', 'f'],
np.array([1, 1, 1, 90, 90]),
np.array([1, 1, 1, 1, 90, 90, 90]),
np.array([[1], [1], [90], [90], [90]]),
np.array(['a', 'b', 'c', 'd', 'e', 'f']),
111,
'abcd')
)


def test_dimensions_vector(boxdimensions_universes, dim_vector):
# wrong box dimension vector size
ts = boxdimensions_universes[0].trajectory.ts
with pytest.raises(ValueError):
SetDimensions(dim_vector)(ts)
hp115 marked this conversation as resolved.
Show resolved Hide resolved


def test_dimensions_transformations_api(boxdimensions_universes):
# test if transformation workes with on-the-fly transformations API
hp115 marked this conversation as resolved.
Show resolved Hide resolved
ref_u, new_u = boxdimensions_universes
ref = ref_u.trajectory.ts
hp115 marked this conversation as resolved.
Show resolved Hide resolved
new_dims = np.float32([2, 2, 2, 90, 90, 90])
ref.dimensions = new_dims
new = SetDimensions(new_dims)(new_u.trajectory.ts)
assert_array_almost_equal(ref.dimensions, new.dimensions, decimal=6)
hp115 marked this conversation as resolved.
Show resolved Hide resolved