-
Notifications
You must be signed in to change notification settings - Fork 663
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
Refactor Transformations from closure into class #2859
Changes from 15 commits
05f2ddd
92a9653
9fc5071
6b7c45b
ae51c5b
a542792
1729ee6
26950b2
5aa8d2b
1c5bbdb
b09bef6
235e8a9
4447869
5ef7d3f
f6331d3
1ebcc33
c412104
3b1c470
6e87625
11f3644
7c857f6
58f6e4e
26dab2f
648c9b0
3f083ae
9ae7f83
26f68bc
ae8a2a2
499efc1
2793ba2
acb4488
1080678
0655275
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -26,34 +26,70 @@ | |||||||||||||||||||||||||||||||||||||||||||||||
Trajectory transformations --- :mod:`MDAnalysis.transformations` | ||||||||||||||||||||||||||||||||||||||||||||||||
================================================================ | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
The transformations submodule contains a collection of functions to modify the | ||||||||||||||||||||||||||||||||||||||||||||||||
trajectory. Coordinate transformations, such as PBC corrections and molecule fitting | ||||||||||||||||||||||||||||||||||||||||||||||||
are often required for some analyses and visualization, and the functions in this | ||||||||||||||||||||||||||||||||||||||||||||||||
module allow transformations to be applied on-the-fly. | ||||||||||||||||||||||||||||||||||||||||||||||||
These transformation functions can be called by the user for any given | ||||||||||||||||||||||||||||||||||||||||||||||||
timestep of the trajectory, added as a workflow using :meth:`add_transformations` | ||||||||||||||||||||||||||||||||||||||||||||||||
of the :mod:`~MDAnalysis.coordinates.base` module, or upon Universe creation using | ||||||||||||||||||||||||||||||||||||||||||||||||
The transformations submodule contains a collection of function-like classes to | ||||||||||||||||||||||||||||||||||||||||||||||||
modify the trajectory. | ||||||||||||||||||||||||||||||||||||||||||||||||
Coordinate transformations, such as PBC corrections and molecule fitting | ||||||||||||||||||||||||||||||||||||||||||||||||
are often required for some analyses and visualization, and the functions in | ||||||||||||||||||||||||||||||||||||||||||||||||
this module allow transformations to be applied on-the-fly. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
A typical transformation class looks like this: | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
.. code-blocks:: python | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
class transfomration(object): | ||||||||||||||||||||||||||||||||||||||||||||||||
orbeckst marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||
def __init__(self, *args, **kwargs): | ||||||||||||||||||||||||||||||||||||||||||||||||
# do some things | ||||||||||||||||||||||||||||||||||||||||||||||||
# save needed args as attributes. | ||||||||||||||||||||||||||||||||||||||||||||||||
self.needed_var = args[0] | ||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a little abstract, a trivial example would be better |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
def __call__(self, ts): | ||||||||||||||||||||||||||||||||||||||||||||||||
# apply changes to the Timestep object | ||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Changes needn't be applied to the timestep oddly enough. You could E.g. modify an AtomGroup and return ts |
||||||||||||||||||||||||||||||||||||||||||||||||
return ts | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You showed the abstract class. Now show a concrete example to address @richardjgowers comment. For instance
Suggested change
I currently can't get nglview to work in my notebook so you'll need to check that this actually works... or come up with another example. EDIT: forgot to increment EDIT 2: yes, it's pretty dumb that the phi angle just keeps incrementing, no matter what you do with the trajectory. Perhaps better to do something like EDIT 3: changed it to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks! it works. And I think it makes sense to just rotate by a fixed angle. (for visualization perhaps) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I changed the snippet. |
||||||||||||||||||||||||||||||||||||||||||||||||
See `MDAnalysis.transformations.translate` for a simple example. | ||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The problem is they can't see the code from the docs, so instead have the above example be translate There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this part (inside There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The above is not a valid sphinx link.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
These transformation functions can be called by the user for any given timestep | ||||||||||||||||||||||||||||||||||||||||||||||||
of the trajectory, added as a workflow using :meth:`add_transformations` | ||||||||||||||||||||||||||||||||||||||||||||||||
of the :mod:`~MDAnalysis.coordinates.base`, or upon Universe creation using | ||||||||||||||||||||||||||||||||||||||||||||||||
the keyword argument `transformations`. Note that in the two latter cases, the | ||||||||||||||||||||||||||||||||||||||||||||||||
workflow cannot be changed after being defined. | ||||||||||||||||||||||||||||||||||||||||||||||||
workflow cannot be changed after being defined. for example: | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
In addition to the specific arguments that each transformation can take, they also | ||||||||||||||||||||||||||||||||||||||||||||||||
contain a wrapped function that takes a `Timestep` object as argument. | ||||||||||||||||||||||||||||||||||||||||||||||||
So, a transformation can be roughly defined as follows: | ||||||||||||||||||||||||||||||||||||||||||||||||
.. code-block:: python | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
u = mda.Universe(GRO, XTC) | ||||||||||||||||||||||||||||||||||||||||||||||||
ts = u.trajectory[0] | ||||||||||||||||||||||||||||||||||||||||||||||||
trans = transformation(args) | ||||||||||||||||||||||||||||||||||||||||||||||||
ts = trans(ts) | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
# or add as a workflow | ||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we only want to promote the workflow usage, else it's just a function they can (forget to) apply |
||||||||||||||||||||||||||||||||||||||||||||||||
u.trajectory.add_transformations(trans) | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
Transformations can also be created as a closure/nested function. | ||||||||||||||||||||||||||||||||||||||||||||||||
In addition to the specific arguments that each transformation can take, they | ||||||||||||||||||||||||||||||||||||||||||||||||
also contain a wrapped function that takes a `Timestep` object as argument. | ||||||||||||||||||||||||||||||||||||||||||||||||
So, a closure-style transformation can be roughly defined as follows: | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
.. code-block:: python | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
def transformations(*args,**kwargs): | ||||||||||||||||||||||||||||||||||||||||||||||||
def transformation(*args,**kwargs): | ||||||||||||||||||||||||||||||||||||||||||||||||
# do some things | ||||||||||||||||||||||||||||||||||||||||||||||||
def wrapped(ts): | ||||||||||||||||||||||||||||||||||||||||||||||||
# apply changes to the Timestep object | ||||||||||||||||||||||||||||||||||||||||||||||||
return ts | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
return wrapped | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
See `MDAnalysis.transformations.translate` for a simple example. | ||||||||||||||||||||||||||||||||||||||||||||||||
Note, to meet the need of serialization of universe, only transformation class | ||||||||||||||||||||||||||||||||||||||||||||||||
are used after MDAnlaysis 2.0.0. One can still write functions (closures) as in | ||||||||||||||||||||||||||||||||||||||||||||||||
MDA 1.x, but that these cannot be serialized and thus will not work with all | ||||||||||||||||||||||||||||||||||||||||||||||||
forms of parallel analysis. For detailed descriptions about how to write a | ||||||||||||||||||||||||||||||||||||||||||||||||
closure-style transformation, read the code in MDA 1.x as a reference | ||||||||||||||||||||||||||||||||||||||||||||||||
or read MDAnalysis UserGuide. | ||||||||||||||||||||||||||||||||||||||||||||||||
orbeckst marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
.. versionchanged:: 2.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||
Transformations should now be created as classes with a :meth:`__call__` | ||||||||||||||||||||||||||||||||||||||||||||||||
method instead of being written as a function/closure. | ||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
from .translate import translate, center_in_box | ||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.