Some quotes I bumped into last week
[gromacs.git] / python_packaging / sample_restraint / README.md
blob586769e4e422675f029b64c9b6e30b71db8a39ba
1 Sample MD restraint plugin
2 ==========================
4 [![image](https://travis-ci.org/kassonlab/sample_restraint.svg?branch=master)](https://travis-ci.org/kassonlab/sample_restraint)
6 This [repository](https://github.com/kassonlab/sample_restraint)
7 provides a complete and working implementation of a few GROMACS
8 restraint potentials. It is intended as both a tutorial and as a
9 template for implementing new custom restraint potentials.
11 Restraint potentials are implemented as \"plugins\" to GROMACS. The
12 required GROMACS modifications are available at this [GitHub
13 repository](https://github.com/kassonlab/gromacs-gmxapi)
15 The plugin potentials are loaded and configured via Python and are
16 compatible with the [gmxapi](https://github.com/kassonlab/gmxapi) Python
17 package for MD simulation workflows.
19 For a quick start, consider pulling a recent Docker image that has
20 already been configured for gmxapi and this plug-in.
22 Reference:
24 Irrgang, M. E., Hays, J. M., & Kasson, P. M. gmxapi: a high-level
25 interface for advanced control and extension of molecular dynamics
26 simulations. *Bioinformatics* 2018. DOI:
27 [10.1093/bioinformatics/bty484](https://doi.org/10.1093/bioinformatics/bty484)
29 Repository Contents
30 -------------------
32 This repository uses CMake to build and install a Python C++ extension
33 package.
35 -   `CMakeLists.txt`, `cmake/FindGROMACS.cmake`, and
36     `src/CMakeLists.txt` provide necessary CMake infrastructure. You
37     should not need to edit these.
38 -   `src/cpp` contains a header and `cpp` file for each restraint
39     potential built with this module. When adding new potentials, you
40     will update `CMakeLists.txt` to create build targets. Use the
41     existing potentials as examples.
42 -   `src/pythonmodule/` contains `CMakeLists.txt`, `export_plugin.h`,
43     and `export_plugin.cpp`. When you have written a new potential, you
44     can add it to `CMakeLists.txt` and `export_plugin.cpp`. This is the
45     code that produces the C++ extension for Python. `HarmonicRestraint`
46     is a simple example that applies a Hooke\'s Law spring between two
47     atoms. `EnsemblePotential` applies a more complicated potential and
48     uses additional facilities provided by gmxapi.
49 -   `src/pybind11` is just a copy of the Python bindings framework from
50     the Pybind project (ref <https://github.com/pybind/pybind11> ). It
51     is used to wrap the C++ restraint code and give it a Python
52     interface.
53 -   `tests/` contains C++ and Python tests for the provided code. Update
54     `CMakeLists.txt` to add your own, based on these examples. C++ unit
55     tests use [googletest](https://github.com/google/googletest). Python
56     tests use the [pytest](https://docs.pytest.org/en/latest/). Refer to
57     those respective projects for more about how they make test-writing
58     easier.
59 -   `examples` contains a sample SLURM job script and
60     `restrained-ensemble.py` gmxapi script that have been used to do
61     restrained ensemble simulations. `example.py` and `example.ipynb`
62     explore a toy alanine dipeptide system. `strip_notebook.py` is a
63     helper script to remove extra output and state data from an iPython
64     notebook before checking updates back into the repository.
65 -   `Dockerfile` is a recipe to build a Docker image from the root of
66     the repository.
68 Docker quick-start
69 ------------------
71 Pull the docker image and launch a container with port 8888 on the host
72 mapped to port 8888 in the container. :
74     docker run --rm -ti -p 8888:8888 gmxapi/sample_restraint:devel
76 Note that the `--rm` option tells docker not to save any changes you
77 make after launching the container. You can, however, download any
78 changes you make to the notebook through the web interface. Refer to the
79 [Docker documentation](https://docs.docker.com) for more options on
80 managing containers.
82 You should then see something like the following, but with a different
83 `token` for the URL. Open the URL in a browser on the same (host)
84 machine to access the notebook server. Browse to `sample_restraint` and
85 `examples` and then launch the `example` notebook for an interactive
86 walk-through. Example output:
88     Execute the command: jupyter notebook
89     [I 15:26:07.683 NotebookApp] Writing notebook server cookie secret to /home/jovyan/.local/share/jupyter/runtime/notebook_cookie_secret
90     [W 15:26:08.184 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
91     [I 15:26:08.223 NotebookApp] JupyterLab alpha preview extension loaded from /opt/conda/lib/python3.6/site-packages/jupyterlab
92     [I 15:26:08.230 NotebookApp] Serving notebooks from local directory: /home/jovyan
93     [I 15:26:08.230 NotebookApp] 0 active kernels
94     [I 15:26:08.230 NotebookApp] The Jupyter Notebook is running at:
95     [I 15:26:08.230 NotebookApp] http://[all ip addresses on your system]:8888/?token=948d611453ea3f03ad406dc375bfc186c4315fa68c50e23d
96     [I 15:26:08.230 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
97     [C 15:26:08.231 NotebookApp]
99         Copy/paste this URL into your browser when you connect for the first time,
100         to login with a token:
101             http://localhost:8888/?token=948d611453ea3f03ad406dc375bfc186c4315fa68c50e23d
103 The basics
104 ----------
106 This repository provides a potentially useful plugin, but also serves as
107 documentation by example and as a template for developing GROMACS
108 extension code in the gmxapi framework.
110 ### Build and install
112 To download, build, and install, you may need to first install `wget`,
113 `git`, and/or `cmake`.
115 The plugin requires libgmxapi to build. See
116 [gromacs-gmxapi](https://github.com/kassonlab/gromacs-gmxapi) :
118     # install GROMACS. Instead of `master`, you can choose a specific release or the `devel` branch.
119     wget https://github.com/kassonlab/gromacs-gmxapi/archive/master.zip
120     unzip master.zip
121     cd gromacs-gmxapi-master
122     mkdir build
123     cd mkdir build
124     cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/gromacs -DGMX_THREAD_MPI=ON
125     make install # use -j10 to build in parallel with 10 cores (or however many you have)
126     cd ../..
128 We use CMake to configure and build a C++ library and a Python module
129 for interacting with it. After installing the modified GROMACS (see
130 above), either source the GMXRC file provided with the GROMACS
131 installation or provide the install location to CMake with the
132 `gmxapi_DIR` environment variable.
134 As with [gmxapi](https://github.com/kassonlab/gromacs-gmxapi), we
135 recommend installing and using this code in a Python virtual
136 environment. (See the documentation for your `gmxapi` distribution or
137 <http://gmxapi.readthedocs.io/en/latest/install.html> ) Accordingly, if
138 you choose to install the plugin rather than just to use it out of
139 its build directory, consider whether you want to have to set your
140 `PYTHONPATH` environment variable or where you can install it that
141 Python will find it. You can explicitly set the installation location by
142 setting `-DGMXPLUGIN_INSTALL_PATH=/path/to/install/directory` or you can
143 let CMake determine an appropriate location automatically for your
144 Python interpreter. If you have administrative privileges (such as when
145 running on a desktop computer) or if you are using a Python virtual
146 environment (recommended), you don\'t need to specify anything
147 additional. If you are an unprivileged user (such as on a shared
148 machine) and are not in a Python virtual environment, set
149 -DGMXPLUGIN\_USER\_INSTALL=ON to install into the \"user\" Python
150 packages directory in your home directory. (Equivalent to the `--user`
151 option to `pip`)
153 If you have multiple Python installations or just want to be
154 unambiguous, provide CMake with the Python interpreter you wish to use
155 (the same as you are using for `gmxapi`) with
156 `-DPYTHON_EXECUTABLE=/path/to/python`. For instance, if you have both
157 Python 3.x and Python 2.7, but you plan to use Python 2.7, use
158 `` -DPYTHON_EXECUTABLE=`which python2` `` or
159 `` -DPYTHON_EXECUTABLE=`which python` `` (if `python` points to the
160 Python 2 interpreter). :
162     # build sample restraint
163     git clone https://github.com/kassonlab/sample_restraint.git
164     # optionally, check out the development branch
165     # pushd sample_restraint ; git checkout devel ; popd
166     # perform an out-of-source build
167     mkdir build
168     cd build
169     # Get the GROMACS environment settings
170     source $HOME/gromacs/bin/GMXRC
171     # Configure the build environment with CMake
172     cmake ../sample_restraint
173     # or
174     # cmake ../sample_restraint -DGMXPLUGIN_INSTALL_PATH=/path/to/install/directory
175     # or
176     # cmake ../sample_restraint -DGMXPLUGIN_USER_INSTALL=ON -DPYTHON_EXECUTABLE=`which python`
177     make
178     # run C++ tests
179     make test
180     # optionally, install
181     make install
183 If you choose not to install the plugin module, you can tell Python
184 where to find it by setting your PYTHONPATH environment variable. For
185 instance, while still in the build directory:
187     export PYTHONPATH=`pwd`/src/pythonmodule
189 The Python module `gmx` is required for testing. See
190 [gmxapi](https://github.com/kassonlab/gmxapi)
192 ### Running
194 The `examples` directory contains some sample scripts for running
195 `gmxapi` workflows using the restraint potential samples in this
196 repository. You may also find `tests/test_binding.py` informative.
198 For a basic walk-through with a toy system, launch a Jupyter notebook
199 server and navigate to `examples/example.py`
201 ### What\'s going on
203 This sample project builds several C++ libraries with names such as
204 `harmonicpotential`. The actual filename will be something like
205 `libharmonicpotential.so` or `harmonicpotential.dll` or something
206 depending on your operating system. These libraries are used to build a
207 Python module named `myplugin`.
209 When setting up a workflow, a Python script provides gmxapi with
210 parameters and a factory function for a plugin restraint potential. This
211 Python interface is defined in `src/pythonmodule/export_plugin.cpp`.
212 When a Session is launched, an C++ object that performs restraint force
213 calculations is created and given to the GROMACS library. During each MD
214 step, part of the MD force evaluation includes a call to the
215 calculations performed by the restraint. For the pair restraints
216 demonstrated here, GROMACS provides relative coordinates of two atomic
217 sites to the calculation code in the plugin. If multiple restrained
218 pairs are needed, multiple restraints are attached to the simulation.
219 Coordination across an ensemble of simulations is possible using
220 resources provided by the Session.
222 Fundamentally, a new restraint potential is implemented by creating a
223 class that provides a `calculate()` method and using wrappers to give it
224 interfaces to GROMACS and to Python. C++ wrappers allow the basic class
225 implementing the potential to be presented to the GROMACS library in a
226 way that can be used to evaluate forces during a simulation. Other C++
227 template code wraps the potential in a portable way so that it can be
228 passed to GROMACS through a Python interface and to receive parameters
229 from the Python interpreter. Pybind11 syntax in `export_plugin.cpp`
230 provides the code to actually expose the plugin as a class in a Python
231 module that is compatible with the `gmx` package provided in the
232 `gmxapi` project.
234 By version 0.1.0, additional wrappers and boilerplate code will be
235 migrated out of the files that define the `calculate()` methods. Until
236 then, some amount of copy-and-paste or editing is necessary to implement
237 a new potential. Refer to `src/cpp/harmonicpotential.h` and to
238 `src/cpp/harmonicpotential.cpp` for a documented example of a simple
239 pair restraint. A more complex example is found in the
240 `ensemblepotential` files. The code in `src/cpp` is sufficient to
241 produce testable object code, but the Python module is exported in
242 `src/pythonmodule/export_plugin.cpp`. If you add additional source files
243 for a new potential, you will need to update `src/cpp/CMakeLists.txt` as
244 well.
246 Python tests
247 ------------
249 For the Python-level testing, you will need `pytest` and `gmxapi`. We
250 recommend setting up a Python virtual environment as described at
251 [<https://github.com/kassonlab/gmxapi>](https://github.com/kassonlab/gmxapi)
253 You will also need a functioning MPI installation and the `mpi4py`
254 package.
256 Python tests can be run from the root directory of the repository after
257 building. Assuming you built in a subdirecory of the repository named
258 `build` (as above):
260     PYTHONPATH=build/src/pythonmodule/ python -m pytest tests
262 This command causes the directory named `tests` to be explored for
263 Python files with names like `test_*.py` or `*_test.py`. Matching files
264 will be imported and any functions with similarly obvious names will be
265 run and errors reported. In particular, `assert` statements will be
266 evaluated to perform individual tests. See also
267 <https://docs.pytest.org/en/latest/goodpractices.html#test-discovery>
269 The tests assume that the package is already installed or is available
270 on the default Python path (such as by setting the `PYTHONPATH`
271 environment variable). If you just run `pytest` with no arguments, it
272 will discover and try to run tests from elsewhere in the repository that
273 were not intended, and they will fail.
275 To run the full set of tests for the ensemble workflow features, first
276 make sure that you have an MPI-capable environment and `mpi4py`
277 installed. Refer to <http://mpi4py.readthedocs.io/en/stable/> and
278 <https://github.com/kassonlab/gmxapi> for more information.
280 The ensemble tests assume that 2 ranks are available. After installing
281 the plugin, run (for example):
283     mpiexec -n 2 python -m mpi4py -m pytest
285 If you do not have MPI set up for your system, you could build a docker
286 image using the Dockerfile in this repository.
288     docker build -t samplerestraint . Dockerfile
289     docker run --cpus 2 --rm -ti samplerestraint bash -c \
290         "cd /home/jovyan/sample_restraint/tests && 
291         mpiexec -n 2 python -m mpi4py -m pytest"
293 To test with a pre-built image from our docker hub repository, do
295     docker run --cpus 2 --rm -ti gmxapi/sample_restraint bash -c \
296             "cd /home/jovyan/sample_restraint/tests && 
297             mpiexec -n 2 python -m mpi4py -m pytest"