From ff39650e56343320a13372aea563ccf46f5aca94 Mon Sep 17 00:00:00 2001
From: James Graham <j.graham@soton.ac.uk>
Date: Fri, 19 Mar 2021 21:00:07 +0000
Subject: [PATCH] docs: WIP move to markdown based docs

---
 .readthedocs.yml     |   2 +-
 docs/arguments.md    |  15 ++++
 docs/conf.py         |   5 +-
 docs/file-formats.md |  83 ++++++++++++++++++++
 docs/index.md        |  17 +++++
 docs/index.rst       | 178 -------------------------------------------
 poetry.lock          | 141 +++++++++++++++++++++++++---------
 pyproject.toml       |  12 ++-
 8 files changed, 236 insertions(+), 217 deletions(-)
 create mode 100644 docs/arguments.md
 create mode 100644 docs/file-formats.md
 create mode 100644 docs/index.md
 delete mode 100644 docs/index.rst

diff --git a/.readthedocs.yml b/.readthedocs.yml
index 1747eca..b3423e0 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -1,7 +1,7 @@
 version: 2
 
 sphinx:
-  configuration: docs/source/conf.py
+  configuration: docs/conf.py
 
 python:
   version: 3.7
diff --git a/docs/arguments.md b/docs/arguments.md
new file mode 100644
index 0000000..3aeec72
--- /dev/null
+++ b/docs/arguments.md
@@ -0,0 +1,15 @@
+# Full Arguments List
+
+## Input Files
+
+`topology`
+: Atomistic simulation topology
+
+`trajectory`
+: Atomistic simulation trajectory
+
+`-m`, `--mapping`
+: CG mapping definition file
+
+`-b`, `--bondset`
+: Bond definition file
diff --git a/docs/conf.py b/docs/conf.py
index c09544f..522a3b2 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -33,8 +33,7 @@ extensions = [
     'autoapi.extension',
     'sphinx_rtd_theme',
     'sphinx.ext.viewcode',
-    # 'recommonmark',
-    'm2r2',
+    'myst_parser',
 ]
 
 source_suffix = ['.rst', '.md']
@@ -47,6 +46,8 @@ templates_path = ['_templates']
 # This pattern also affects html_static_path and html_extra_path.
 exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
 
+myst_enable_extensions = ['deflist']
+
 
 # -- Options for HTML output -------------------------------------------------
 
diff --git a/docs/file-formats.md b/docs/file-formats.md
new file mode 100644
index 0000000..587e487
--- /dev/null
+++ b/docs/file-formats.md
@@ -0,0 +1,83 @@
+# File Formats
+
+## Mapping Definition File
+An example of mapping definition file for the monosaccharide allose taken from `test/data/sugar.map` is shown below.
+
+Molecule names (as present in the gro coordinate file) are used as section headers inside square brackets.
+Each of the following lines describes a single coarse-grained bead mapping.
+The items on a line are:
+- the name of the bead
+- its MARTINI bead type
+- optionally the bead charge
+- a list of all the atom names it should contain
+
+All items on a line are whitespace separated.
+Multiple molecules may be specified in their own sections.
+It is not recommended to provide a mapping for water since MARTINI water combines four molecules into a single bead which is not yet supported by PyCGTOOL.
+Note that bead charges in the MARTINI framework are by convention integers and are used only for formally charged functional groups.  An example of a molecule mapping using charges can be found in `test/data/dppc.map`.
+
+```
+; comments begin with a semicolon
+[ALLA]
+C1 P3 C1 O1
+C2 P3 C2 O2
+C3 P3 C3 O3
+C4 P3 C4 O4
+C5 P2 C5 C6 O6
+O5 P4 O5
+
+[SOL]
+W P4 OW HW1 HW2
+```
+
+The Martini 3.0 force field has now introduced the use of virtual sites for polycylic compounds or polysaccharides in order to improve numerical stability for highly constrained structures.
+Below is an example of how virtual sites can be included in the mapping file for naphthalene (see `/test/data/martini3/naphthalene.map`).
+Similar to the previously described mapping syntax, a virtual site is defined with a prefix of ``@v`` as follows `@v [name] [type] [charge] [constructing beads]`.
+The constructing beads refer to a list of space delimited coarse grained bead names from which the position of the virtual site will be calculated.
+Currently virtual sites can be constructed from either the center of geometry or mass of the constructing sites via the `--virtual_map_center` flag.
+
+```
+[ NAPH ]
+R1 TC4 C8 H8 C9 H9
+R2 TC4 C6 H6 C7 H7
+@v R3 TC4 R1 R2 R4 R5
+R4 TC4 C1 H1 C2 H2
+R5 TC4 C3 H3 C4 H4
+```
+
+## Bond Definition File
+An example bond definition file for the monosaccharide allose taken from `test/data/sugar.bnd` is shown below.
+
+As in the mapping definition file, molecule names are used as section headers inside square brackets. 
+The following lines define bonds lengths, angles and dihedrals between coarse-grained beads. 
+Each line is a list of bead names, using the names defined in the mapping file. 
+Two bead names on a line defines a bond length, three defines an angle, and four defines a dihedral.
+
+If no angles are defined for a molecule, PyCGTOOL will construct all angles from the list of bonds. 
+This may also be enabled for dihedrals via the `--generate_dihedrals` flag, but is not recommended as in most cases coarse-grained models do not require dihedrals. 
+Additionally, any angles inside a triangle of bond lengths are excluded from the output as they often cause simulation stability issues when used in conjunction with LINCS.
+
+```
+; comments begin with a semicolon
+[ALLA]
+C1 C2
+C2 C3
+C3 C4
+C4 C5
+C5 O5
+O5 C1
+
+C1 C2 C3
+C2 C3 C4
+C3 C4 C5
+C4 C5 O5
+C5 O5 C1
+O5 C1 C2
+
+C1 C2 C3 C4
+C2 C3 C4 C5
+C3 C4 C5 O5
+C4 C5 O5 C1
+C5 O5 C1 C2
+O5 C1 C2 C3
+```
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 0000000..3938516
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,17 @@
+
+# PyCGTOOL Documentation
+
+```{toctree}
+:maxdepth: 2
+self
+file-formats
+tutorial
+mapping-only
+arguments
+autoapi/index
+```
+
+```{include} ../README.md
+:relative-docs: docs/
+:relative-images:
+```
diff --git a/docs/index.rst b/docs/index.rst
deleted file mode 100644
index 9050812..0000000
--- a/docs/index.rst
+++ /dev/null
@@ -1,178 +0,0 @@
-.. PyCGTOOL documentation master file, created by
-   sphinx-quickstart on Tue Feb 23 21:47:28 2016.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
-Welcome to PyCGTOOL's documentation!
-====================================
-
-.. toctree::
-   :maxdepth: 2
-
-   self
-   tutorial
-   mapping-only
-   autoapi/index
-
-
-Features
---------
-PyCGTOOL provides a means to quickly and easily generate coarse-grained molecular dynamics models within the MARTINI framework from all-atom or united-atom simulation trajectories.
-
-A user defined mapping is applied to the input trajectory and bonded terms (lengths, angles and dihedrals) are measured.  From these measurements, equilibrium values and force constants are found and a GROMACS topology is created for the target molecules.
-
-Requirements
-------------
-PyCGTOOL requires:
-
-- Python 3.6 or greater
-- Numpy (http://www.numpy.org/)
-- MDTraj (http://mdtraj.org/1.7.2/)
-- Scipy (https://www.scipy.org/)
-- Cython (http://cython.org/)
-
-Optional:
-
-- Python testing framework (e.g. py.test)
-- Sphinx to generate documentation yourself (http://www.sphinx-doc.org/en/stable/)
-
-Basic Usage
------------
-PyCGTOOL requires four input files to generate a coarse-grained model:
-
-- AA simulation topology file (e.g. PDB, GRO, etc.)
-- AA simulation trajectory file (e.g. XTC, DCD, etc.)
-- PyCGTOOL mapping definition file
-- PyCGTOOL bond definition file
-
-The program is called by::
-
-    pycgtool <topology file> <trajectory file> -m <MAP file> -b <BND file>
-
-Example mapping and bond definition files are present in the ``test/data`` directory.  Their format is explained below.
-
-After running PyCGTOOL two files, ``out.gro`` and ``out.itp`` will be created.  The gro file contains the mapped coarse-grain coordinates with every molecule for which a mapping was provided.  The itp file contains the parameters for each molecule type.
-
-It is important to perform validation of any new parameter set.
-This is typically done by comparing properties between the reference simulation and simulations using the new CG model.
-In the tutorial we use the radius of gyration, but there are many other suitable properties, depending on the class of molecule being parametrised.
-
-Mapping / Bond Definition Files
--------------------------------
-The mapping and bond definition input files use a format similar to the GROMACS itp/top format.
-
-Mapping Definition
-~~~~~~~~~~~~~~~~~~
-An example of mapping definition file for the monosaccharide allose taken from ``test/data/sugar.map`` is shown below.
-
-Molecule names (as present in the gro coordinate file) are used as section headers inside square brackets.  Each of the following lines describes a single coarse-grained bead mapping.  The items on a line are: the name of the bead, its MARTINI bead type, optionally the bead charge, and a list of all the atom names it should contain.  All items on a line are whitespace separated.  Multiple molecules may be specified in their own sections.
-It is not recommended to provide a mapping for water since MARTINI water combines four molecules into a single bead which is not yet supported by PyCGTOOL.
-Note that bead charges in the MARTINI framework are by convention integers and are used only for formally charged functional groups.  An example of a molecule mapping using charges can be found in ``test/data/dppc.map``. ::
-
-   ; comments begin with a semicolon
-   [ALLA]
-   C1 P3 C1 O1
-   C2 P3 C2 O2
-   C3 P3 C3 O3
-   C4 P3 C4 O4
-   C5 P2 C5 C6 O6
-   O5 P4 O5
-
-   [SOL]
-   W P4 OW HW1 HW2
-
-The Martini 3.0 force field has now introduced the use of virtual sites for polycylic compounds or polysaccharides
-in order to improve numerical stability for highly constrained structures. Below is an example of how virtual sites
-can be included in the mapping file for naphthalene (see ``/test/data/martini3/naphthalene.map`` ). Similar to the previously
-described mapping syntax, a virtual site is defined with a prefix of ``@v`` as follows ``@v [name] [type] [charge] [constructing beads]``.
-The constructing beads refer to a list of space delimited coarse grained bead names from which the position of the
-virtual site will be calculated. Currently virtual sites can be constructed from either the center of geometry or mass of
-the constructing sites via the ``--virtual_map_center`` flag.::
-
-   [ NAPH ]
-   R1 TC4 C8 H8 C9 H9
-   R2 TC4 C6 H6 C7 H7
-   @v R3 TC4 R1 R2 R4 R5
-   R4 TC4 C1 H1 C2 H2
-   R5 TC4 C3 H3 C4 H4
-
-Bond Definition
-~~~~~~~~~~~~~~~
-An example bond definition file for the monosaccharide allose taken from ``test/data/sugar.bnd`` is shown below.
-
-As in the mapping definition file, molecule names are used as section headers inside square brackets.  The following lines define bonds lengths, angles and dihedrals between coarse-grained beads.  Each line is a list of bead names, using the names defined in the mapping file.  Two bead names on a line defines a bond length, three defines an angle, and four defines a dihedral.
-
-If no angles are defined for a molecule, PyCGTOOL will construct all angles from the list of bonds.  This may also be enabled for dihedrals via the ``--generate_dihedrals`` flag, but is not recommended as in most cases coarse-grained models do not require dihedrals.  Additionally, any angles inside a triangle of bond lengths are excluded from the output as they often cause simulation stability issues when used in conjunction with LINCS. ::
-
-   ; comments begin with a semicolon
-   [ALLA]
-   C1 C2
-   C2 C3
-   C3 C4
-   C4 C5
-   C5 O5
-   O5 C1
-
-   C1 C2 C3
-   C2 C3 C4
-   C3 C4 C5
-   C4 C5 O5
-   C5 O5 C1
-   O5 C1 C2
-
-   C1 C2 C3 C4
-   C2 C3 C4 C5
-   C3 C4 C5 O5
-   C4 C5 O5 C1
-   C5 O5 C1 C2
-   O5 C1 C2 C3
-
-Advanced Usage
---------------
-
-Modes
-~~~~~
-
-PyCGTOOL performs several other functions which may be useful in the testing and use of coarse-grained models.
-
-Mapping Only
-............
-
-Mapping-only mode simply converts an input atomistic coordinate file into its coarse-grained representation.
-For full detail see: :doc:`mapping-only`.
-
-This mode may be invoked by::
-
-   pycgtool <topology file> -m <MAP file>
-
-
-Measure Only
-............
-
-Measure-only mode may be used to aid in the testing of a coarse-grained model by making measurements of bonds from a true coarse-grained simulation trajectory.
-These bond measurements may be compared directly to those collected from the pseudo-coarse-grained trajectory used to generate the model.
-This mode may be invoked by::
-
-   pycgtool <topology file> <trajectory file> -b <BND file>
-
-
-Advanced Options
-~~~~~~~~~~~~~~~~
-
-==================   ==========================================   =======================
-Option               Description                                  Values
-==================   ==========================================   =======================
-output_name          Base name of output files                    **out**, any string
-output               Coordinate output format                     **gro**
-output_xtc           Should a pseudo-CG XTC be created            **False**, True
-map_center           Mapping method                               **geom**, mass
-virtual_map_center   Virtual site mapping method                  **geom**, mass
-constr_threshold     Convert stiff bonds to constraints over      **100000**, any number
-dump_measurements    Whether to output bond measurements          **False**, True
-dump_n_values        How many measurements to output              **10000**, any number
-output_forcefield    Output a GROMACS forcefield directory?       **False**, True
-temperature          Temperature of reference simulation          **310**, any number
-default_fc           Use default MARTINI force constants?         **False**, True
-generate_angles      Generate angles from bonds                   **True**, False
-generate_dihedrals   Generate dihedrals from bonds                **False**, True
-==================   ==========================================   =======================
diff --git a/poetry.lock b/poetry.lock
index 0ccc959..9eda7cc 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -2,7 +2,7 @@
 name = "alabaster"
 version = "0.7.12"
 description = "A configurable sidebar-enabled Sphinx theme"
-category = "dev"
+category = "main"
 optional = false
 python-versions = "*"
 
@@ -10,7 +10,7 @@ python-versions = "*"
 name = "astroid"
 version = "2.4.1"
 description = "An abstract syntax tree for Python with inference support."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.5"
 
@@ -43,7 +43,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 name = "attrs"
 version = "20.3.0"
 description = "Classes Without Boilerplate"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
@@ -57,7 +57,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>
 name = "babel"
 version = "2.9.0"
 description = "Internationalization utilities"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
@@ -68,7 +68,7 @@ pytz = ">=2015.7"
 name = "certifi"
 version = "2020.12.5"
 description = "Python package for providing Mozilla's CA Bundle."
-category = "dev"
+category = "main"
 optional = false
 python-versions = "*"
 
@@ -76,7 +76,7 @@ python-versions = "*"
 name = "chardet"
 version = "4.0.0"
 description = "Universal encoding detector for Python 2 and 3"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
@@ -130,7 +130,7 @@ python-versions = ">=3.6, <3.7"
 name = "docutils"
 version = "0.16"
 description = "Docutils -- Python Documentation Utilities"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
@@ -171,7 +171,7 @@ flake8 = "*"
 name = "idna"
 version = "2.10"
 description = "Internationalized Domain Names in Applications (IDNA)"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
@@ -179,7 +179,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 name = "imagesize"
 version = "1.2.0"
 description = "Getting image size from png/jpeg/jpeg2000/gif file"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
@@ -225,7 +225,7 @@ xdg_home = ["appdirs (>=1.4.0)"]
 name = "jinja2"
 version = "2.11.3"
 description = "A very fast and expressive template engine."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
@@ -247,15 +247,34 @@ python-versions = ">=3.6"
 name = "lazy-object-proxy"
 version = "1.4.3"
 description = "A fast and thorough lazy object proxy."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package]]
+name = "markdown-it-py"
+version = "0.6.2"
+description = "Python port of markdown-it. Markdown parsing, done right!"
+category = "main"
+optional = false
+python-versions = "~=3.6"
+
+[package.dependencies]
+attrs = ">=19,<21"
+mdit-py-plugins = ">=0.2.1,<0.3.0"
+
+[package.extras]
+code_style = ["pre-commit (==2.6)"]
+compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistune (>=0.8.4,<0.9.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "panflute (>=1.12,<2.0)"]
+linkify = ["linkify-it-py (>=1.0,<2.0)"]
+rtd = ["myst-nb (>=0.11.1,<0.12.0)", "sphinx-book-theme", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-copybutton", "sphinx (>=2,<4)", "pyyaml"]
+testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "pytest-benchmark (>=3.2,<4.0)", "psutil"]
+
 [[package]]
 name = "markupsafe"
 version = "1.1.1"
 description = "Safely add untrusted strings to HTML/XML markup."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
 
@@ -267,6 +286,21 @@ category = "dev"
 optional = false
 python-versions = "*"
 
+[[package]]
+name = "mdit-py-plugins"
+version = "0.2.6"
+description = "Collection of plugins for markdown-it-py"
+category = "main"
+optional = false
+python-versions = "~=3.6"
+
+[package.dependencies]
+markdown-it-py = ">=0.5.8,<2.0.0"
+
+[package.extras]
+code_style = ["pre-commit (==2.6)"]
+testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"]
+
 [[package]]
 name = "mdplus"
 version = "0.0.5"
@@ -300,6 +334,28 @@ numpy = ">=1.6"
 pyparsing = "*"
 scipy = "*"
 
+[[package]]
+name = "myst-parser"
+version = "0.13.5"
+description = "An extended commonmark compliant parser, with bridges to docutils & sphinx."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+docutils = ">=0.15"
+jinja2 = "*"
+markdown-it-py = ">=0.6.2,<0.7.0"
+mdit-py-plugins = ">=0.2.5,<0.3.0"
+pyyaml = "*"
+sphinx = ">=2,<4"
+
+[package.extras]
+code_style = ["flake8 (>=3.7.0,<3.8.0)", "black", "pre-commit (==1.17.0)"]
+linkify = ["linkify-it-py (>=1.0,<2.0)"]
+rtd = ["sphinxcontrib-bibtex (<2.0.0)", "ipython", "sphinx-book-theme (>=0.0.36)", "sphinx-panels (>=0.5.2,<0.6.0)"]
+testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "beautifulsoup4"]
+
 [[package]]
 name = "numpy"
 version = "1.19.5"
@@ -320,7 +376,7 @@ python-versions = ">=3.7"
 name = "packaging"
 version = "20.9"
 description = "Core utilities for Python packages"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
@@ -403,11 +459,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "pydocstyle"
-version = "5.1.1"
+version = "6.0.0"
 description = "Python docstring style checker"
 category = "dev"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.6"
 
 [package.dependencies]
 snowballstemmer = "*"
@@ -543,7 +599,7 @@ testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "pytest-xdist",
 name = "pytz"
 version = "2021.1"
 description = "World timezone definitions, modern and historical"
-category = "dev"
+category = "main"
 optional = false
 python-versions = "*"
 
@@ -551,7 +607,7 @@ python-versions = "*"
 name = "pyyaml"
 version = "5.4.1"
 description = "YAML parser and emitter for Python"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
 
@@ -559,7 +615,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
 name = "requests"
 version = "2.25.1"
 description = "Python HTTP for Humans."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
@@ -667,7 +723,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 name = "snowballstemmer"
 version = "2.1.0"
 description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
-category = "dev"
+category = "main"
 optional = false
 python-versions = "*"
 
@@ -675,7 +731,7 @@ python-versions = "*"
 name = "sphinx"
 version = "3.5.2"
 description = "Python documentation generator"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.5"
 
@@ -706,7 +762,7 @@ test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"]
 name = "sphinx-autoapi"
 version = "1.7.0"
 description = "Sphinx API documentation generator"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.6"
 
@@ -726,7 +782,7 @@ go = ["sphinxcontrib-golangdomain"]
 name = "sphinx-rtd-theme"
 version = "0.5.1"
 description = "Read the Docs theme for Sphinx"
-category = "dev"
+category = "main"
 optional = false
 python-versions = "*"
 
@@ -740,7 +796,7 @@ dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"]
 name = "sphinxcontrib-applehelp"
 version = "1.0.2"
 description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.5"
 
@@ -752,7 +808,7 @@ test = ["pytest"]
 name = "sphinxcontrib-devhelp"
 version = "1.0.2"
 description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.5"
 
@@ -764,7 +820,7 @@ test = ["pytest"]
 name = "sphinxcontrib-htmlhelp"
 version = "1.0.3"
 description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.5"
 
@@ -776,7 +832,7 @@ test = ["pytest", "html5lib"]
 name = "sphinxcontrib-jsmath"
 version = "1.0.1"
 description = "A sphinx extension which renders display math in HTML via JavaScript"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.5"
 
@@ -787,7 +843,7 @@ test = ["pytest", "flake8", "mypy"]
 name = "sphinxcontrib-qthelp"
 version = "1.0.3"
 description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.5"
 
@@ -799,7 +855,7 @@ test = ["pytest"]
 name = "sphinxcontrib-serializinghtml"
 version = "1.1.4"
 description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.5"
 
@@ -827,7 +883,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 name = "typed-ast"
 version = "1.4.2"
 description = "a fork of Python 2 and 3 ast modules with type comment support"
-category = "dev"
+category = "main"
 optional = false
 python-versions = "*"
 
@@ -843,7 +899,7 @@ python-versions = "*"
 name = "unidecode"
 version = "1.2.0"
 description = "ASCII transliterations of Unicode text"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
@@ -851,7 +907,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 name = "urllib3"
 version = "1.26.4"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
 
@@ -875,7 +931,7 @@ toml = "*"
 name = "wrapt"
 version = "1.12.1"
 description = "Module for decorators, wrappers and monkey patching."
-category = "dev"
+category = "main"
 optional = false
 python-versions = "*"
 
@@ -899,10 +955,13 @@ python-versions = ">=3.6"
 docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
 testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
 
+[extras]
+docs = ["Sphinx", "sphinx-autoapi", "sphinx-rtd-theme", "myst-parser"]
+
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.6"
-content-hash = "1c426d5fdb40b4313cd1074500745074a1798a9f7409762e6cb14b7d9c750a54"
+content-hash = "e4bcaa64355811624e2a262935d8c627679fc3f3e2ac0aa40436f780336561d6"
 
 [metadata.files]
 alabaster = [
@@ -1103,6 +1162,10 @@ lazy-object-proxy = [
     {file = "lazy_object_proxy-1.4.3-cp38-cp38-win32.whl", hash = "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd"},
     {file = "lazy_object_proxy-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239"},
 ]
+markdown-it-py = [
+    {file = "markdown-it-py-0.6.2.tar.gz", hash = "sha256:c3b9f995be0792cbbc8ab2f53d74072eb7ff8a8b622be8d61d38ab879709eca3"},
+    {file = "markdown_it_py-0.6.2-py3-none-any.whl", hash = "sha256:30b3e9f8198dc82a5df0dcb73fd31d56cd9a43bf8a747feb10b2ba74f962bcb1"},
+]
 markupsafe = [
     {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"},
     {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"},
@@ -1142,6 +1205,10 @@ mccabe = [
     {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
     {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
 ]
+mdit-py-plugins = [
+    {file = "mdit-py-plugins-0.2.6.tar.gz", hash = "sha256:1e467ca2ea056e8065cbd5d6c61e5052bb50826bde84c40f6a5ed77e82125710"},
+    {file = "mdit_py_plugins-0.2.6-py3-none-any.whl", hash = "sha256:77fd75dad81109ee91f30eb49146196f79afbbae041f298ae4886c8c2b5e23d7"},
+]
 mdplus = []
 mdtraj = [
     {file = "mdtraj-1.9.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c02a9a589acc98dd3cc4db9b0cb21725f5e2cb9484c14cc4fa032a4663c7a1e9"},
@@ -1150,6 +1217,10 @@ mdtraj = [
     {file = "mdtraj-1.9.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7eae1adc6aa876396c9797d80db3f71da831601fb1739da731e1de9ca8ac96ab"},
     {file = "mdtraj-1.9.5.tar.gz", hash = "sha256:f22c28c9dd51aa0f8692078dd3c2c7a338a7ca27cbd9aaeb669a60361e95adc4"},
 ]
+myst-parser = [
+    {file = "myst-parser-0.13.5.tar.gz", hash = "sha256:72cf89cc0d6f35070736da19643c9ef52e570e3e13e30c007ad9b94a21f5457a"},
+    {file = "myst_parser-0.13.5-py3-none-any.whl", hash = "sha256:47e469cef8ba209f4dcb82cd0b4f935171c78c6a2cc0072cd3a9724242eb81ee"},
+]
 numpy = [
     {file = "numpy-1.19.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff"},
     {file = "numpy-1.19.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea"},
@@ -1234,8 +1305,8 @@ pycodestyle = [
     {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"},
 ]
 pydocstyle = [
-    {file = "pydocstyle-5.1.1-py3-none-any.whl", hash = "sha256:aca749e190a01726a4fb472dd4ef23b5c9da7b9205c0a7857c06533de13fd678"},
-    {file = "pydocstyle-5.1.1.tar.gz", hash = "sha256:19b86fa8617ed916776a11cd8bc0197e5b9856d5433b777f51a3defe13075325"},
+    {file = "pydocstyle-6.0.0-py3-none-any.whl", hash = "sha256:d4449cf16d7e6709f63192146706933c7a334af7c0f083904799ccb851c50f6d"},
+    {file = "pydocstyle-6.0.0.tar.gz", hash = "sha256:164befb520d851dbcf0e029681b91f4f599c62c5cd8933fd54b1bfbd50e89e1f"},
 ]
 pyflakes = [
     {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"},
diff --git a/pyproject.toml b/pyproject.toml
index e038d98..dbac21b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "pycgtool"
-version = "2.0.0-alpha.6"
+version = "2.0.0-alpha.7"
 description = "Generate coarse-grained molecular dynamics models from atomistic trajectories."
 authors = ["James Graham <j.graham@soton.ac.uk>"]
 license = "GPL-3.0-only"
@@ -38,6 +38,12 @@ mdtraj = "^1.9.5"
 rich = "^9.2.0"
 mdplus = { git = "https://bitbucket.org/claughton/mdplus.git" }
 
+# Extra for building docs
+Sphinx = { version = "^3.4.3", optional = true }
+sphinx-autoapi = { version = "^1.5.1", optional = true }
+sphinx-rtd-theme = { version = "^0.5.1", optional = true }
+myst-parser = { version = "^0.13.5", optional = true }
+
 [tool.poetry.dev-dependencies]
 prospector = "^1.3.0"
 pytest = "^6.0.1"
@@ -49,6 +55,10 @@ flake8 = "^3.8.4"
 Sphinx = "^3.4.3"
 sphinx-autoapi = "^1.5.1"
 sphinx-rtd-theme = "^0.5.1"
+myst-parser = "^0.13.5"
+
+[tool.poetry.extras]
+docs = ["Sphinx", "sphinx-autoapi", "sphinx-rtd-theme", "myst-parser"]
 
 [build-system]
 requires = ["poetry>=0.12"]
-- 
GitLab