From 24e68a34a02b946c6fdbb5b4ec29f3ea83d850ef Mon Sep 17 00:00:00 2001 From: Okke van Eck <39912605+OkkeVanEck@users.noreply.github.com> Date: Sun, 16 Jul 2023 11:49:22 +0200 Subject: [PATCH] Develop (#55) * Rework readme (#6) * Renamed actions and added badges to readme * Switched slash for dash * Fix import structure (#10) * Fixed import structure * Removed pull_request target as push also seems to trigger on pull request? * Fix visualization helpers (#13) * Fixed bugs * Added pull_request again as trigger for workflow * Update build_deploy.yml * Fix compressing core and installed pre-commit (#15) * Pre-commit test * Added local hook for zipping core * Added .zip and .tar.gz autozips into core_archives folder * Zip test * tar.gz test * Compressing works, only really ugly workaround for moving files * Refered to the archives in the README * Fix datasets (#17) * Release v0.2a1 (#14) * Rework readme (#6) * Renamed actions and added badges to readme * Switched slash for dash * Fix import structure (#10) * Fixed import structure * Removed pull_request target as push also seems to trigger on pull request? * Fix visualization helpers (#13) * Fixed bugs * Added pull_request again as trigger for workflow * Deleted old log file and changed setup version * Restructured dataset files and added package_data to setup.py, also changed max-line-length for black to 79 * New setup for loading datasets * Added dataset inclusion * Added archiving for datasets * Test for matrix include (#18) * Test for matrix include * Added runOns variable * Changed to a custom action * Added inputFile * Copied literal line * Changed strategy order * Check only ubuntu * Extended matrix with all OS and extra CIBW_BUILD ENV flag * Added default of only python 3.6 builds for 64-bit if push is not to master * Added enter to README * Release v0.2a2 (#20) * Release v0.2a1 (#14) * Rework readme (#6) * Renamed actions and added badges to readme * Switched slash for dash * Fix import structure (#10) * Fixed import structure * Removed pull_request target as push also seems to trigger on pull request? * Fix visualization helpers (#13) * Fixed bugs * Added pull_request again as trigger for workflow * Deleted old log file and changed setup version * Changed master trigger to release trigger * Moved wildcard * Moved wildcard of JMESPath * Added dot * Trying starts_with * Switched arguments * Excluded python 2.7 pypy * New jmespath filter test * Changed version number * Add PyTest to repo and CI (#21) * Added first pytest script for protein class and a script for performing local tests. * Added pytest in CI * Forgot -r for file * Version of pytest with pytest at end of pipeline * New pytest CI where pip installs local package * Fixed tabs and added caching of python/pip environment * Removed dot and added removal of build dirs to manage clean command * Added cache ignores for env setup and ids for the caches * Fixed cache IDs * Renamed cache because GitHub does not allow for clearing caches... * Moved python setup to be before cache loading * Run that will install the dependencies * Uncommented the cache-hit detection for installing dependencies * Updated pre-commit version in hope that runner will create new cache * Added more tests and added flake8 incompatability * Other flake8 config try * Reset to .flake8 file * Downgrade of pre-commit to force dep. installation in CI * Different pre-commit version * Added depth_first tests * Added depth_first_bnb tests * Push to try and install all dependencies correctly * Added back cache check for installing dependencies. New way of calling flake8, added class dependencies on tests * Removed ls * Core change test * Core change test - new correctly * Core archiving works * Fixed pytest ordering and upgraded pandas version to trigger new cache * Upgraded pandas * Changed pandas version to 1.1.0 * Removed caching of CI and moved code to new PR * Add CI caching for python environments (#23) * Added first pytest script for protein class and a script for performing local tests. * Added pytest in CI * Forgot -r for file * Version of pytest with pytest at end of pipeline * New pytest CI where pip installs local package * Fixed tabs and added caching of python/pip environment * Removed dot and added removal of build dirs to manage clean command * Added cache ignores for env setup and ids for the caches * Fixed cache IDs * Renamed cache because GitHub does not allow for clearing caches... * Moved python setup to be before cache loading * Run that will install the dependencies * Uncommented the cache-hit detection for installing dependencies * Updated pre-commit version in hope that runner will create new cache * Added more tests and added flake8 incompatability * Other flake8 config try * Reset to .flake8 file * Downgrade of pre-commit to force dep. installation in CI * Different pre-commit version * Added depth_first tests * Added depth_first_bnb tests * Push to try and install all dependencies correctly * Added back cache check for installing dependencies. New way of calling flake8, added class dependencies on tests * Removed ls * Core change test * Core change test - new correctly * Core archiving works * Fixed pytest ordering and upgraded pandas version to trigger new cache * Upgraded pandas * Changed pandas version to 1.1.0 * Dependency check * new flake8 installation * Flake8 action * Added pip update flag * Cleaned up the flake8 action usage * Trying to install new deps * Removed caching, only using dependencies during pytest * Add documentation to project (#24) * Ran the sphinx quickstart, ignored mypy on docs * First version of docs * Added installation instructions for python * Finished installation page and added quickstart info (not done yet) * Finished v1 of the quickstart guide * Removed heterogeneous setup page and added todo for creating example * Added manpages for the datasets and algorithms * Added helpers and visualize documentation * Added placeholders for the Protein properties * Added methods of Protein to the documentation * Small changes * Reworked the README * Added whitespace for enter * Added github star and filler-logo * Starting on logo * Added logo * Removed github fork banner * Logo test * Changed logo loading * New test * Trying image tag * Trying image tag 2.0 * Trying image tag 2.0 * Trying relative link * New size * New logo test * New logo try * New logo * Reworked logo * Downgraded matplotlib to alllow CI pipeline * Added edittable logo, fixed small rst things, fixed compression of cores * Added some figures, added reference to license, added license * Started on AminoAcid class (#28) * Started on AminoAcid class * Added comments in core, still bugs to sort out * Fixed more bugs in the core when adding AminoAcid class * Moved part of bind * Integrated AminoAcid class and fixed Protein tests * Mid way testing for new depth-first approach * Added local check script and depth_first works for HPPH * Fixed depth_first search new version * Fixed depth_first_bnb algorithm using new system * Fixed small core bugs, working on new logo * Mid-way of changing bond_value structure * Cleaned up bugs from intermediate version. Bumped versions of requirements. Introduced max_weights string for keeping track of possible future scores. Merged bond_semetry model setup with the else model setup. Fixed bug with cur_len of protein always being 1. Fixed getting the weight of a amino bond * Bumbed python version in github workflow for matplotlib version dependency * Bumped workflow python version to 3.9 as numpy 1.23 requires so * Removed h_idxs from prune function. Nothing has been tested * Fixed Protein signature for pybind build * Setup for debugging current protein issues * Introduced core testing code * Finished test script for amino acids * Started on Protein core tests * Fixed protein test compilation * Fixed first couple protein generation checks * Added more debug statements for core tests * Fixed bugs with bond checks * Fixed generation of weighted amino maps * Finished all protein generation test * Added debug options in script to run core tests with gdb * Added removal of amino tests * Updated some pytest asserts. Added pytest and core_test asserts for score updates * Updated reference for black in pre-commit * Try adding core build in github actions pipeline * Fixed local algorithm core tests * Fixed dfs_bnb * Fixed pybind11 change to providing protein pointers * Added special compilation case for MacOS * Changed minimum Python version to 3.9 as 3.11 will release soon * Changed always build to only build python 3.9 versions * Changed CIwheel builds to be specific instead of exlcuding based * Leaving documentation as is and adding issue for the future * Added more licensing references * Added config file for rtfd to set python version to 3.9 * Temp commit to switch branch * Update core merge (#33) * Started on AminoAcid class * Added comments in core, still bugs to sort out * Fixed more bugs in the core when adding AminoAcid class * Moved part of bind * Integrated AminoAcid class and fixed Protein tests * Mid way testing for new depth-first approach * Added local check script and depth_first works for HPPH * Fixed depth_first search new version * Fixed depth_first_bnb algorithm using new system * Fixed small core bugs, working on new logo * Mid-way of changing bond_value structure * Cleaned up bugs from intermediate version. Bumped versions of requirements. Introduced max_weights string for keeping track of possible future scores. Merged bond_semetry model setup with the else model setup. Fixed bug with cur_len of protein always being 1. Fixed getting the weight of a amino bond * Bumbed python version in github workflow for matplotlib version dependency * Bumped workflow python version to 3.9 as numpy 1.23 requires so * Removed h_idxs from prune function. Nothing has been tested * Fixed Protein signature for pybind build * Setup for debugging current protein issues * Introduced core testing code * Finished test script for amino acids * Started on Protein core tests * Fixed protein test compilation * Fixed first couple protein generation checks * Added more debug statements for core tests * Fixed bugs with bond checks * Fixed generation of weighted amino maps * Finished all protein generation test * Added debug options in scriptn to run core tests with gdb * Fixed the last_pos indexing error from place_amino. Changed the 'changed' variable to 'solutions_found'-like variable * Solved typing issues * Finished protein movement tests * Added removal of amino tests * Updated some pytest asserts. Added pytest and core_test asserts for score updates * Updated reference for black in pre-commit * Fixed score generation of core_test * Fixed score update through removal * Try adding core build in github actions pipeline * Started on algorithm code * Changed signature of depth_first to use pointers. Added testing code for 2d and 3d depth_first tests * Fixed local algorithm core tests * Fixed dfs_bnb * Fixed pybind11 change to providing protein pointers * Added dynamic_lookup for linking python in case of undefined symbols * New way of setting -undefined flag * Updated the way of passing -undefined setting for macos * Added special compilation case for MacOS * Saving Furo update for issue * Changed minimum Python version to 3.9 as 3.11 will release soon * Updated versions for wheel deployment * Changed always build to only build python 3.9 versions * Changed CIwheel builds to be specific instead of exlcuding based * Leaving documentation as is and adding issue for the future * Added more licensing references * Added config file for rtfd to set python version to 3.9 * Removed commented code * Merge visualization updates (#41) (#42) * Develop merge into master to sync commits. (#41) * Rework readme (#6) * Renamed actions and added badges to readme * Switched slash for dash * Fix import structure (#10) * Fixed import structure * Removed pull_request target as push also seems to trigger on pull request? * Fix visualization helpers (#13) * Fixed bugs * Added pull_request again as trigger for workflow * Update build_deploy.yml * Fix compressing core and installed pre-commit (#15) * Pre-commit test * Added local hook for zipping core * Added .zip and .tar.gz autozips into core_archives folder * Zip test * tar.gz test * Compressing works, only really ugly workaround for moving files * Refered to the archives in the README * Fix datasets (#17) * Release v0.2a1 (#14) * Rework readme (#6) * Renamed actions and added badges to readme * Switched slash for dash * Fix import structure (#10) * Fixed import structure * Removed pull_request target as push also seems to trigger on pull request? * Fix visualization helpers (#13) * Fixed bugs * Added pull_request again as trigger for workflow * Deleted old log file and changed setup version * Restructured dataset files and added package_data to setup.py, also changed max-line-length for black to 79 * New setup for loading datasets * Added dataset inclusion * Added archiving for datasets * Test for matrix include (#18) * Test for matrix include * Added runOns variable * Changed to a custom action * Added inputFile * Copied literal line * Changed strategy order * Check only ubuntu * Extended matrix with all OS and extra CIBW_BUILD ENV flag * Added default of only python 3.6 builds for 64-bit if push is not to master * Added enter to README * Release v0.2a2 (#20) * Release v0.2a1 (#14) * Rework readme (#6) * Renamed actions and added badges to readme * Switched slash for dash * Fix import structure (#10) * Fixed import structure * Removed pull_request target as push also seems to trigger on pull request? * Fix visualization helpers (#13) * Fixed bugs * Added pull_request again as trigger for workflow * Deleted old log file and changed setup version * Changed master trigger to release trigger * Moved wildcard * Moved wildcard of JMESPath * Added dot * Trying starts_with * Switched arguments * Excluded python 2.7 pypy * New jmespath filter test * Changed version number * Add PyTest to repo and CI (#21) * Added first pytest script for protein class and a script for performing local tests. * Added pytest in CI * Forgot -r for file * Version of pytest with pytest at end of pipeline * New pytest CI where pip installs local package * Fixed tabs and added caching of python/pip environment * Removed dot and added removal of build dirs to manage clean command * Added cache ignores for env setup and ids for the caches * Fixed cache IDs * Renamed cache because GitHub does not allow for clearing caches... * Moved python setup to be before cache loading * Run that will install the dependencies * Uncommented the cache-hit detection for installing dependencies * Updated pre-commit version in hope that runner will create new cache * Added more tests and added flake8 incompatability * Other flake8 config try * Reset to .flake8 file * Downgrade of pre-commit to force dep. installation in CI * Different pre-commit version * Added depth_first tests * Added depth_first_bnb tests * Push to try and install all dependencies correctly * Added back cache check for installing dependencies. New way of calling flake8, added class dependencies on tests * Removed ls * Core change test * Core change test - new correctly * Core archiving works * Fixed pytest ordering and upgraded pandas version to trigger new cache * Upgraded pandas * Changed pandas version to 1.1.0 * Removed caching of CI and moved code to new PR * Add CI caching for python environments (#23) * Added first pytest script for protein class and a script for performing local tests. * Added pytest in CI * Forgot -r for file * Version of pytest with pytest at end of pipeline * New pytest CI where pip installs local package * Fixed tabs and added caching of python/pip environment * Removed dot and added removal of build dirs to manage clean command * Added cache ignores for env setup and ids for the caches * Fixed cache IDs * Renamed cache because GitHub does not allow for clearing caches... * Moved python setup to be before cache loading * Run that will install the dependencies * Uncommented the cache-hit detection for installing dependencies * Updated pre-commit version in hope that runner will create new cache * Added more tests and added flake8 incompatability * Other flake8 config try * Reset to .flake8 file * Downgrade of pre-commit to force dep. installation in CI * Different pre-commit version * Added depth_first tests * Added depth_first_bnb tests * Push to try and install all dependencies correctly * Added back cache check for installing dependencies. New way of calling flake8, added class dependencies on tests * Removed ls * Core change test * Core change test - new correctly * Core archiving works * Fixed pytest ordering and upgraded pandas version to trigger new cache * Upgraded pandas * Changed pandas version to 1.1.0 * Dependency check * new flake8 installation * Flake8 action * Added pip update flag * Cleaned up the flake8 action usage * Trying to install new deps * Removed caching, only using dependencies during pytest * Add documentation to project (#24) * Ran the sphinx quickstart, ignored mypy on docs * First version of docs * Added installation instructions for python * Finished installation page and added quickstart info (not done yet) * Finished v1 of the quickstart guide * Removed heterogeneous setup page and added todo for creating example * Added manpages for the datasets and algorithms * Added helpers and visualize documentation * Added placeholders for the Protein properties * Added methods of Protein to the documentation * Small changes * Reworked the README * Added whitespace for enter * Added github star and filler-logo * Starting on logo * Added logo * Removed github fork banner * Logo test * Changed logo loading * New test * Trying image tag * Trying image tag 2.0 * Trying image tag 2.0 * Trying relative link * New size * New logo test * New logo try * New logo * Reworked logo * Downgraded matplotlib to alllow CI pipeline * Added edittable logo, fixed small rst things, fixed compression of cores * Added some figures, added reference to license, added license * Started on AminoAcid class (#28) * Started on AminoAcid class * Added comments in core, still bugs to sort out * Fixed more bugs in the core when adding AminoAcid class * Moved part of bind * Integrated AminoAcid class and fixed Protein tests * Mid way testing for new depth-first approach * Added local check script and depth_first works for HPPH * Fixed depth_first search new version * Fixed depth_first_bnb algorithm using new system * Fixed small core bugs, working on new logo * Mid-way of changing bond_value structure * Cleaned up bugs from intermediate version. Bumped versions of requirements. Introduced max_weights string for keeping track of possible future scores. Merged bond_semetry model setup with the else model setup. Fixed bug with cur_len of protein always being 1. Fixed getting the weight of a amino bond * Bumbed python version in github workflow for matplotlib version dependency * Bumped workflow python version to 3.9 as numpy 1.23 requires so * Removed h_idxs from prune function. Nothing has been tested * Fixed Protein signature for pybind build * Setup for debugging current protein issues * Introduced core testing code * Finished test script for amino acids * Started on Protein core tests * Fixed protein test compilation * Fixed first couple protein generation checks * Added more debug statements for core tests * Fixed bugs with bond checks * Fixed generation of weighted amino maps * Finished all protein generation test * Added debug options in script to run core tests with gdb * Added removal of amino tests * Updated some pytest asserts. Added pytest and core_test asserts for score updates * Updated reference for black in pre-commit * Try adding core build in github actions pipeline * Fixed local algorithm core tests * Fixed dfs_bnb * Fixed pybind11 change to providing protein pointers * Added special compilation case for MacOS * Changed minimum Python version to 3.9 as 3.11 will release soon * Changed always build to only build python 3.9 versions * Changed CIwheel builds to be specific instead of exlcuding based * Leaving documentation as is and adding issue for the future * Added more licensing references * Added config file for rtfd to set python version to 3.9 * Temp commit to switch branch * Update core merge (#33) * Started on AminoAcid class * Added comments in core, still bugs to sort out * Fixed more bugs in the core when adding AminoAcid class * Moved part of bind * Integrated AminoAcid class and fixed Protein tests * Mid way testing for new depth-first approach * Added local check script and depth_first works for HPPH * Fixed depth_first search new version * Fixed depth_first_bnb algorithm using new system * Fixed small core bugs, working on new logo * Mid-way of changing bond_value structure * Cleaned up bugs from intermediate version. Bumped versions of requirements. Introduced max_weights string for keeping track of possible future scores. Merged bond_semetry model setup with the else model setup. Fixed bug with cur_len of protein always being 1. Fixed getting the weight of a amino bond * Bumbed python version in github workflow for matplotlib version dependency * Bumped workflow python version to 3.9 as numpy 1.23 requires so * Removed h_idxs from prune function. Nothing has been tested * Fixed Protein signature for pybind build * Setup for debugging current protein issues * Introduced core testing code * Finished test script for amino acids * Started on Protein core tests * Fixed protein test compilation * Fixed first couple protein generation checks * Added more debug statements for core tests * Fixed bugs with bond checks * Fixed generation of weighted amino maps * Finished all protein generation test * Added debug options in scriptn to run core tests with gdb * Fixed the last_pos indexing error from place_amino. Changed the 'changed' variable to 'solutions_found'-like variable * Solved typing issues * Finished protein movement tests * Added removal of amino tests * Updated some pytest asserts. Added pytest and core_test asserts for score updates * Updated reference for black in pre-commit * Fixed score generation of core_test * Fixed score update through removal * Try adding core build in github actions pipeline * Started on algorithm code * Changed signature of depth_first to use pointers. Added testing code for 2d and 3d depth_first tests * Fixed local algorithm core tests * Fixed dfs_bnb * Fixed pybind11 change to providing protein pointers * Added dynamic_lookup for linking python in case of undefined symbols * New way of setting -undefined flag * Updated the way of passing -undefined setting for macos * Added special compilation case for MacOS * Saving Furo update for issue * Changed minimum Python version to 3.9 as 3.11 will release soon * Updated versions for wheel deployment * Changed always build to only build python 3.9 versions * Changed CIwheel builds to be specific instead of exlcuding based * Leaving documentation as is and adding issue for the future * Added more licensing references * Added config file for rtfd to set python version to 3.9 * Removed commented code * Splitted visualization function to allow for multiple styles * Fixed function for plotting proteins * Fixed bug where no bonds would form * Fixed paper style * V1 paper style plots * Fixed first paper visualization. Added visualization to test set * Ran pre-commit * Increased version to make new visualizations available * Add beam (#47) * V1 (untested) of a beam_search function * Compiles and runs, does not work * In mids of debug * Small changes * Changed wrong author usage in toml. Fixing copy issues with proteins and amino acids * Fixed copy operators for Protein and AminoAcid * Fixed bug in assignment and copy operators. New try for testing beam, which is also semi fixed * Fixed beam_search bugs * Added a more specific heuristic function for beam search and removed unnescessary branching in reach_prune * Solved bug in beam_search and add protein length to print * Finished beam search tests * Extended AminoAcid with << and = operator overloads * Added ptests for beam search and naive prune * Fixed typo for beam search class * Trying other pytest approach for mac * Trying run-on conditional from matrix * Removed file specifier for pytest * Added Windows runner check to linux * Enabled windows runner again * ALso removed big beam width * Removing dir slash in setuptools for windows buil * Removed windows due to Pybind11 bug * 32 change documentation to match core functionality (#53) * Made abstraction for version identification. Changed docs style to Furo. Updated internal contents to match core more. Visualization and Datasets still need to be done, as well as more visualizations * Wrote more on visualization and datasets. Only need to add correct figures, and fix pipeline issue when generating the core * Fixed versioning and importing for compilation. Added new figures for quickstart docs * Added last missing method * Added AminoAcid class to the API focs * Added beam search to the docs api * Added furo to docs requirements.txt * Trying different configuration for building readthedocs * Removed versioning * Exended and pinned requirements for docs * Changed python version to make readthedocs work. Also changed some small things * More minimal setup for furo * Upped versioning and new try for dong data reading * Removed commented code * Trying Windows build again * Trying full pytest on MacOS * Different Pip upgrade line for window * Excluded Windows again because it wants to be a special snowflake.. * Upped pybind in setup --- .github/workflows/matrix_includes.BAK | 12 +- .github/workflows/matrix_includes.json | 8 +- .readthedocs.yaml | 11 +- README.md | 6 +- docs/requirements.txt | 3 + docs/source/_static/prospr_logo.png | Bin 959056 -> 33428 bytes docs/source/_static/prospr_logo.xcf | Bin 52177 -> 0 bytes docs/source/_static/quickstart_basic.png | Bin 0 -> 20493 bytes docs/source/_static/quickstart_paper.png | Bin 0 -> 10752 bytes .../_static/quickstart_paper_no_legend.png | Bin 0 -> 7759 bytes .../source/_static/quickstart_paper_outer.png | Bin 0 -> 10369 bytes docs/source/api.rst | 150 ++++++++++++++- docs/source/conf.py | 55 ++++-- docs/source/index.rst | 2 +- docs/source/installation.rst | 10 +- docs/source/quickstart.rst | 174 +++++++++++++++--- manage.sh | 9 + prospr/__init__.py | 3 +- prospr/_version.py | 1 + prospr/core/core_module.cpp | 2 +- prospr/datasets.py | 6 +- pyproject.toml | 4 +- requirements.txt | 21 ++- 23 files changed, 389 insertions(+), 88 deletions(-) create mode 100644 docs/requirements.txt delete mode 100644 docs/source/_static/prospr_logo.xcf create mode 100644 docs/source/_static/quickstart_basic.png create mode 100644 docs/source/_static/quickstart_paper.png create mode 100644 docs/source/_static/quickstart_paper_no_legend.png create mode 100644 docs/source/_static/quickstart_paper_outer.png create mode 100644 prospr/_version.py diff --git a/.github/workflows/matrix_includes.BAK b/.github/workflows/matrix_includes.BAK index 1ef7f6e..57200d8 100644 --- a/.github/workflows/matrix_includes.BAK +++ b/.github/workflows/matrix_includes.BAK @@ -3,37 +3,37 @@ "runOn": "master", "os": "ubuntu-latest", "cibw_skip": "", - "cibw_build": "cp39-* cp310-* pp37-* pp38-* pp39-*" + "cibw_build": "cp39-* cp310-* pp39-*" }, { "runOn": "master", "os": "windows-latest", "cibw_skip": "", - "cibw_build": "cp39-* cp310-* pp37-* pp38-* pp39-*" + "cibw_build": "cp39-* cp310-* pp39-*" }, { "runOn": "master", "os": "macos-latest", "cibw_skip": "", - "cibw_build": "cp39-* cp310-* pp37-* pp38-* pp39-*" + "cibw_build": "cp39-* cp310-* pp39-*" }, { "runOn": "release-", "os": "ubuntu-latest", "cibw_skip": "", - "cibw_build": "cp39-* cp310-* pp37-* pp38-* pp39-*" + "cibw_build": "cp39-* cp310-* pp39-*" }, { "runOn": "release-", "os": "windows-latest", "cibw_skip": "", - "cibw_build": "cp39-* cp310-* pp37-* pp38-* pp39-*" + "cibw_build": "cp39-* cp310-* pp39-*" }, { "runOn": "release-", "os": "macos-latest", "cibw_skip": "", - "cibw_build": "cp39-* cp310-* pp37-* pp38-* pp39-*" + "cibw_build": "cp39-* cp310-* pp39-*" }, { "runOn": "always", diff --git a/.github/workflows/matrix_includes.json b/.github/workflows/matrix_includes.json index e4be8b4..0e87e48 100644 --- a/.github/workflows/matrix_includes.json +++ b/.github/workflows/matrix_includes.json @@ -3,25 +3,25 @@ "runOn": "master", "os": "ubuntu-latest", "cibw_skip": "", - "cibw_build": "cp39-* cp310-* pp37-* pp38-* pp39-*" + "cibw_build": "cp39-* cp310-* pp39-*" }, { "runOn": "master", "os": "macos-latest", "cibw_skip": "", - "cibw_build": "cp39-* cp310-* pp37-* pp38-* pp39-*" + "cibw_build": "cp39-* cp310-* pp39-*" }, { "runOn": "release-", "os": "ubuntu-latest", "cibw_skip": "", - "cibw_build": "cp39-* cp310-* pp37-* pp38-* pp39-*" + "cibw_build": "cp39-* cp310-* pp39-*" }, { "runOn": "release-", "os": "macos-latest", "cibw_skip": "", - "cibw_build": "cp39-* cp310-* pp37-* pp38-* pp39-*" + "cibw_build": "cp39-* cp310-* pp39-*" }, { "runOn": "always", diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 7e02fdf..a2434a1 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -3,8 +3,15 @@ version: 2 build: os: "ubuntu-20.04" tools: - python: "3.10" + python: "3.9" -# Build from the docs/ directory with Sphinx +# Build from the docs/ directory with Sphinx. sphinx: configuration: docs/source/conf.py + +# Install Python requirements. +python: + install: + - requirements: docs/requirements.txt + - method: pip + path: . diff --git a/README.md b/README.md index 06d8b94..a7c7702 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,16 @@

Prospr's logo

+
![GitHub](https://img.shields.io/github/license/OkkeVanEck/prospr) ![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/OkkeVanEck/prospr?include_prereleases) ![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/OkkeVanEck/prospr/.github/workflows/build_deploy.yml?branch=master) [![Documentation Status](https://readthedocs.org/projects/prospr/badge/?version=latest)](https://prospr.readthedocs.io/en/latest/?badge=latest) -[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) +[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) + +
+ **Creator:** Okke van Eck Prospr is a universal toolbox for protein structure prediction within the diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..ab68bb4 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +Sphinx==7.0.1 +docutils==0.20.01 +furo==2023.5.20 diff --git a/docs/source/_static/prospr_logo.png b/docs/source/_static/prospr_logo.png index 9644dd4412eae49a107eb1f009ca90652b7edd55..f931d8d7c98ef4d5a1c1080138c21167b925ebbd 100644 GIT binary patch literal 33428 zcmeFZbzGI*);3CaOG|exx~02INK6~$X z?{nVY`OZG)ynmgIkBav_=a_SjIpP}ESUfRW8j9E$#3#xNWlnT(&Vp{I_y4~?t4i?y92l*aS9E0hN6YiA7y=li|(m0hZ_NJiPcB~d4m z$*3WYLc^joq`MnYXE<3Vdq!K&JuOY63%<3NEM)6*@a@v>9qzr#_F|cd@y{~fyRv*g z(hj@36PJ#q&8eH)yO%4y7gJ^uK4(EoD5mspk51&-3k+_Kt}eo<-wOI>-n$nycbScv zb#MPXA^+||a=pl6FGv34&a^U^i?DYK^Tza9{DH1tO>o{vv4Yuys{-!BrJn|u6xG^+ z3P(Sdst7vs+BC6Ngsx6Ja0qNW+UQ`%SU6+Cj0mG^TunkNteml zdw-vHm(QaXr81QxK01=+my2%mU&}l*EN%M@?rb=P(o zXp<6i-HAs`_MVv%o>?(HsMi6mPvXk1>y#Y^60)eM;eniJxiQ zLm?X!f?-&!pJbekCTc~>zCYq$?-@uOhv(x>u`JpmCnINIFH^hy`n9qs#Zp6LE7ifd zZA;rinK4tx9-k$V+`(O7R>#4qX?D^=71Hv>-l4W-QZ^~XdcSOT(eJ?0b^OCiR2y6z zQp-p(n^$vVyt|GKFJJETbreF5iv3Y2WJ_cqhx6=XuOpk?(y?mZ{S| zx!`#MX<78Xp_FVmSKnO!;+joi=CwPV*M=U5##^sqALD0!=uhCeY32M?M`1xE&Z9voUWj3{Vy2iTYQN zW%E`F`M0Z+y=y;y<1y>^dUVb4RGoiheLnDf!GzsY%X8qp_j^VUvSoP&|Dm!)>;eqi zAE@wiO9%7R-LJj6-x^mz#{DnlpPk~vw=xs97Qv&icdY4r8wlK=iLNr`%BoN1oZf9b zz`GL+kqq3I5W2sql@z+T^YC{*vxIx!xqsItwA4ee2p9Z{W4;OEPS!BF!+M*awNoHD zezWs%H~capJhQJhH}=z_xXW%>gA#7oTb~mLR}o)#y})h)olU+iNu+k7Oxp zGeuIo4}Kl#YI&;-dkFk6Pdq(f{wdK=x_A*|qAgpz?nw2Dc0I+0``V^i)}=yY_ZOxD zx7rWv?Fwhrxmum%_QscSRhc#mr-l)Is1ds7d5lXLvtv->s=Q5=l9%&0uj0Cl#W(%n z_$cFcENe7Azjo3pk>XORn3L&bF; z^TK%Wy6hWV->PlkzEiGwOh~b5>|!a$^iAN{K(`#xj&Q$Bm{_j~&Hm(v=WbI%D%Uw9|)At8#@?-3q1J_(;-M#4QT zH7_^(RzzJGI(bs%{d@P$*#^PUPt{ZEiNlI=sD=Xr8>_L|SMvqyiUpz2`PpmB*7;lf zS`v3U?3BS`W?y^(5BV zkx<5-%b6s}uLsNTrs374w$(nNi#8df^7C;{+Vd?vtqX^) zn13SZQ&X#8GWDIR6yA#`hE!b13!Yqs+vGRJsgsk0;N3*%i`2%47_z}_0W&HW>0hI# zWezdaH-=_#^rLBxW{sUB_y z6IQrH8F~&q+PMHwor0Lwh`75Z^1)1q1i`vC+U7wPwy!~6GDrHeps|J_yh6@sMRf{Z zl%OB#4UZ~02etSLl>|rCGbZ}eyk$i~423wkR;*$?DpEI$ah|sDPn+=|OW9qpM zw?{b~<<{hIYd9a%UeZ}T%D3}LN@ux6y2i{Wvn?7+nOTb8@kOrSZqsnx46m!?*ZD%1 z_e48JE+3Cm((glzw!i=Sw1V_oZKc7EMk%T|%;1)ncVVwfNM>;6aO8q#l4*_wP|Kw^ ziF?{P+1MtHD&H$Te4`w(B|o2HL{MS#NXo|T1wZ6#SEYyC1CylmINOv!U zt3()^>@XU^F>acmTG`Royl$z+gtP9DKtzk7W$5!7JKp+9gVS)Zfr5u;^m$<8w>HVv z8>PE6GrS!=I!O$uL_}z`{TVuimB4nT#&f5Szi{gVu_|hAHMzvHVBQm@c}I*7U?3qbAJw5cm5OoCeRe;4bXO4bfMThc|gNRU8ut z`N;!hShdrf88Md^x~!gWa6{#MF~;fYRUiIDBx$ZU(dyop-q1k~mHIvU<{5T^HpB_* zs0v!;>>@RxE#8VW6vjiaRMNrw9c9fx{Mj2i27M$d+!+Ol@)%#;Dbvh)QMH1d#af~- zN34uri8qkM(-Qr2e-kM^q)UaAh0Ws{na8v~d_^ZKB9Z^uhmx6BX}+>jD_CC)Ll~9T z;U>>n3I~2y3gW&TD4NQ-M5+jf)k!9sU30U$QEqEoE5u0z_r>cuE#eyoAH@QKHGboP zV=2DY891pJ=HzIpv8TwqB@dF%kfhwRhUezt&=nS?$~;_?LysA;95N?#R~pnqzgUg7 zzEoc)r^9(g-`*50M38#syKJJ;D(l?NTijQ-QH$8$kE|;p%!|d`8l@J0H0Xn0gBTJO zZ(GZ!rOiJ;UKPm3MpW;Op%b9_+e0q>Su!?y!sw?{PFEZ~?tF6euQPUQTLhGa7nM`p z1{Z5%)TTwLVg#9|aH@;C&J50jQ`q^9<*SZ_lZx}Jb}uxSHwy)r%G&U$Qbc%VhU_ea z2qY}9e>D{5=fX1wKFfdHOG=O=@EB2{r!yJ{@e_Mu=3Exn%WL}G8*Q3EBSt1yc-I-m zmM6zgq^SjDL%(_$fA+4>sduq32)xD8$!u?Tv1=(uCDy$Tm>HoXxx1tbzP{0TGoubc z(6Uh~3VyocFJX9kbG6jaFMr%8nqBv!_g4l&;87P+(K#x)@R@_Z@yFSY@ye*9PckJ| zeWNwW)E7R%xd<<9Q6xBq{Sg>^_c)HY77JhTr(&W}mh=d5B(l59MH?nZJsA0~^U=GRl75s9zDVSFg7;`ItngL|U24#!kJ&?wl3DlM5LrOQ zrSJ}qG?YnYk?b9k*km~B1DcoNY2}ZLmTVbm2h&Ag5h>A#;Zc)6{v1~$9bg>--|?ih zfz_F9u#(ZRD?_(>CcaW*LOWay|6!ocN?+-RH+=T$yyM8bwGVj^E|x#FBG<<0aFs`> z?Z2AXVePz4K%7%3muSRe%Rab2+__sI>FyjR3E&7NIbq)U72P$#xFSC_?b?-*6tISS z=Q&}PloFp4+^HGp*_xm&Z6j~vGvv8YUepitzvbLebqP>saVm>RdqU`-%D*^MtrQ7k`CQ?S z;(qt`m7F0M@iPr3&Xg7A*KD^+<;i2<5mUNxyvpROZqVRvs@R-pNSPdlQrvv&#G1uf z6^)AW_oxWQV8r21s4U|(`Mk5O^!!Q{-5QNX6fXG0ej-+OUqixtEZlYcL&N z%OQ6#>Ra>Fxwoyl6{Ps>8xL)vMh^$?^^ex#Ca(Bu=$?nf+5NLFxx%5`@77ryF|4KL z*w@W(7#`-ChYq}0v8P0Se&38AI8`XfTd3qhu&c5`Z^q9iA{V3cb#ORsB@Fd9Q#R@X zPXu)t%_Z@xlj3ahs~2cJI3j{}VGcy8Dt-3N=_*P4wc(`=TUL#7(VUdirq4?2t4ydd zCah*Fi+);u<_#VG zqPu( zp*6{njdI8~?%DJ#gO-)fL{_Qz{smKiDTVVcCIkTjxsjWdJkzLH3#KCt4brcvP#7l; zkj!FEPWGf=d={+iWiS_(|JiwRRqGYVn;(y1??k- zX)HOb{<=Dmnq{WCZFh;aU7>e&>x0hdt0OG;G5YX<&cSiy*mAfUm?-VzyxWHH?(F$( z76O(nDD5(P`i+lbax+uXa-Z=Nc}zD{@`3B%@;D7hW?*S7HTp@jtxZ07%$QL3NI*fX z%`QAuJCB@qVs{^bK0_TZ*9=`^)|p}TGW$<0q*+%rcLQ_}w#O?GGP zl)C2ay|TD7r2g)>^JXJtJT$&Ij+Yi*DpTJmage3=zQ1u4OLU21=kz0*b&4=Dd+fp5 zxWdYmotx4oS`PAS_1$BZWO`>ff>o74$_|kPu6r^p)#N%2Ir*1+dIiSp+#zIZtTI#~ z@rknGIguhNHAW_iP`=_15y{%Ev4PO7LfVc&8%>n>k!78-&t&ZI`3<`}@AM4=M$WbD z)IZzfKs@L=;6n7$MX#CLp1S#mW`)|W&3FW4ZfeCFvfPRJ*f7-d@Al6ut~Alfo#`UmU8D zmr#~I)Kp2=RRnF;1ZRM{7T2c7s9f+F+Iq-^TUm<>GP@zo2Z*9P>ln9d%&|V=2NEYVE_`t!*kBJ=x7BYvUBCan-_mfetvO?)vTLF`Z-*K2D*HK84Gd>nX?jwoR z0P4*Whcr@H1QP3p0$p08VN3}wx<4XrD*SJqD5d4ZU!)h$b?(I<*DY0ZiP;;lh_A1s z6vY#;dx|I8YFjjlcN8ydheulLEJWiQ=wB9@Nzqg_pmphcNg;K3eY+gL)Ss{H71o_H zimFk93qLqvOGks$GrnmnYkbH?Hib>NY-&7U_MBn-%XhWRAI{&ilNl7@KNAi)lVy>CEC}hZB;!-f4kmJG5`KcANJwc>VCIl z@$ENaQHD`XCsXA!?L7ZBkuJ>42g8e3+eIlO5iIQRtRZoe(r-QYW>u(PWS(VNMe*t`gj-R9<^m}@Y zV!Qo)i~zmo63JP&Ly1ob-@qoFQ@PkO2EovKV{=64%6G_kxymZqFxmZoFj2JB~v9BDro)aR`!P zSXYR#uM*vdQtW}phfdK1{L4=j;CKw^FMp5`%{ z;_OrDc>}L_H-`^b*;o+t?n%4`v|OF~RUGefKp8oWO}-yZSt%l67-SUPjHM)nSp3bi zXHfdm@ahB`)5}lG?I-8?;)jY9MTVo*Vrcu5s+79#ooI_22j`Wq;$kHXDi$-_ zkyXx@BruhbP8lD5xb5CzkaS?oHeLL7PHS?Wpk+J#wrBE4s_PraYO_kXO}JSyqPv&I z-fM)GtA-Lyt3qBh^aRZ)IY;sm#FEJ}Rb-1>76p_$OOA%-7X6G9ig|Y*N0#IHjHnzx z67_+q2=@>8fpHZgyu{Vtp5)Egmd`9RB;omeLmD#I!xAOOV>Be?NT+u6UzGS^RI0_^ zm3+w@K`UTT_2q=B^u_yUM&bn_daK3XH-g#+cTyIPFR+$*B)bD14Ily0$E? zYhvYaYG|@&!pzLZvX=TJW!mRGX?-G%H^}2QGTpd=tZnav(XR1wE7W89T7Ig*fuT?w zJw{2FD?^YNImQ!7kcBQy1NCeP-MEsh$uV0@;q^!q-!osVpDG&CVbP~O-Zc5!eyH%p zq=l|{r=KvYZIjSEm$1V+0@7x~%?|l>c3o?u5bMwkz51wkcIJ_(aL#smVZCv(X87WW5+{S;nj2gyjeLN*~Y%*g}LA_sajrN zM*HVkre73f73}et;wud(`%MNaHDy0R9-`7&F+7&8!~axPz;85?eidS^w`ttIC~Snc zKmytD5aG;1>C9~|@wk~2-Y)4xBM^Bn*t|19v08gUo#8O)E7B`a*-mOtt>2tOizW6U z^)r%^tCy$KhpnQJ@b%GT?VHB5&_V&xL%9T6?v%Ml z&|iMjso5ErXEcO)x!-N3TJ3+p5oI;KeR=hOY6vF~uHJkkWz z|I^X_#fu z9$8hv6^ zZVKq3iI^qV~{)2YVMPhL$f5`BV4YjhT(w|o zXG1Z?m!b|Om6Nm1;9*u)_M|YoI6OMz{L~;?aN}`WEfNPWk>Z;{R<7P5E!JuGF!v&+ z_ccpR-&UU`)6?Y3l-<|?mt0IvOff#k^2aBA<`(ZJKB+uxD6YcS#8=c)uLz)BdpG<% zu0j7z{igU8rmRRHG<%mnDy4@mgGM?$lud=DS0P?Mj}Vjfdy>zgqDi+LXM_nOw>w86 z0(Si_>V4SKg3;9wIu|P;>U%SaElVV{UkC}W)&i&>X{;d~N+KHgjhIy-@)eZM8X29U zZ7-p4zA=7Pk7}|HC#xChIQ(Y4f_43*=Y}lsF)?W?a;Sr;%UEEp1f1Ot+jB$;3WO5m zVbg=d{rvOAJMpPs2dMm&?um+0TY{kLb!!K@TZZatqLwaBoaR<87En%KCs)w@f`b#2 z^mR42bbxx&SU_#;oW$wwsuN>?$F168oHK#4wfQTbdnMn zV!on4fD_cyoW|G5(b+@PSDfyTTv6~n>@gP|&7UEj4&ro%>RL3iF78koeolT)Ziu|E zoi{I?1O|SI@y;H9 z(*n>3m#?`i7Y`>lmy;9MKhN;+l=lWg{Y{QkmR_*!Da(n|!PXbGaD26;y?p=cg|3|w^s%QoOq)D{!Xn@xyaIfJ zd_p2Tf9?5?JbkFU2e3q#Odf7dzQ5$cu0<3a1}N4XW~V^FAF<#pqO$H#b59p{T^AQe zaXOd?8raM~=1n8^*QF@gd4LhmVHW>4n|};-`|DqSxqzeHpI00Cm0|oy5H-q~7bG!fMvUr7sEV!+pRuDlUC_m7!umD6@(8>a0!DB9L z%@5_b;O6~5NcV8D_Vh7#hf3RklY-L#1Nw6s8kRq*Wc}B@_}D^WdgA8gfp7~zc)4|X z1Vwp8Lp$xHw>0o?4gQaH{YPE@mInTuSvmy;VL3dSp;sFPTYYzJjUnyB( z2Ogq&Dyz$*ZlU5}kYZaIsK&v;(ZDIoN$dK4|Fz)bOE|qMap>bM)G31oFOx!SFC`;` zO_vt}U&4tjS^5xx4MQcJlSaP!%S$E<-!dO9v~WCo1O!$F^Qo5HCF+Y*YCrAN z>^Uo+lc0R&Bs38ln~L1$Tce{QaQNWs31!J73%?1r9Qc}vkxqz?jviF`$#Dy>koKf> zXN)@sdH$(@tJjQ*$sTM7mvzd-Da#zqIhE$XmBU=?^YIXhu*>l%<&f^TI8E%2iYy-s z@mH>VoKT33PQW96Buv+Hn-(1%8$W4FSe+l8Ze#feqel?l=MBrdo+wi}V@91gMVHG1t|To1H4dx2nld_tUYw{v?z&QI%=&D?Ws2<+XOk*05L z3`>5`ZG7;Ol9R)-A3wP@@7%#W-Hq@JXsN>-jpTQx^ef6DGeMP;v+A~5x*i=BjNvnA z&@-b^UPH54vYzJ!dh07>YFQrhj|@n7$rM$h2-kuIR^zE0g7|K|_+Wuq=20^Ukp<(h z?A6ka>Lk&E5y}MA6^SJ~RRKovXaO5Dar@ zQ}R%}`8c3ze2APJ5@eq5doxBbPY$!M@rf$E$q@mQQf4xycb>)=IJrZEvtosMzbU!j zxhQ|FTIImrXr=*rxqc8gZ?ER-i07YJw)VTpalXSw>T|G5j0%BPSL0un_&}(`q&K2P zR2g4&@p_%lUQSLoJzk-t?lNZ3mN$;SlZ=UWdB6BYO+yB=WIao#DHpk*W7ffvWbmCB z_-ZvHz)zV*7RW1;l&hFNL{b8~V+f0^34z(rA3p(Vhkfr@urpqnjfHY_`R!f6ebCT^ zmMta4CB;La)s(WZSKOp{E%tg{!QFCepXM?CobiKk0qk!qup^jdDE#Bkzdicr7yr$p zzh?a3oBr>N{ogJ1|8iU2$`yVIsYppZJqWiFKsoqCGFnq@t%MxUJ1?kO5Ws^;kHZ;e z*c+Ia!`$P){`}jce}3`bJo;$1KQzV4mK2Ph$SQSkOK1U3;3MB+%g1Nq^dMj!t^R%puOY3s%f=-9NTXbApZx|}>9diiS?7NFN-Lgqrt$M2=$%vM%+j$Mw z{;y@q^|Id|6aDry6fDCs$!m%oXNMgciaAZY9eG^om*%a*O$Llez?i(1z#l@~azc9+l%NHr9F`4jOt*@-4 z2n9}>Rd8SLHY!k2Q3Yd|Tv75j3G-yD(J?b`wY}h^r$_YblyLbJZDSMX>;0ZH?1NUL znT+9^%qJCkML7G`0BW-G@jZqeef&HF85Px|U#vtfhT!nzWaQ!K>D;njv0RK~1TS!? zI5iR7T)U=W6fXf_dygL71aF$&wil$Q6EZL{Rew*j8TErxeEXgFi6m5&HR%aVWBNUg zf^m<0_Lt||JX&2>5MYWcETqXA+q7tt0IqpY*pq*EHCOPZOtp7tDCWaRq#ZwUF#Q)W zD?T2Jfq|jp5QLPih%>VMJ_P7@!}S|vUC+j@LhIon{G;8OjhhR0EK)cKELs7U}Hy0y{a;|Ub>Dn{%@*uD?fCW~- zk!-(KraaZ;*k4}{k0oL+mWjZqG<>&O5cK=@_Bm$iYo>{8H71_(6G^;4gN4OiPRRT_ zlL$ZG-L&XIgj2uHR^KBFQ*KNgoaXkbmtx}LCm#*UR9@Z@4ug(9zLR3U=(amNtg@W`i!Ui&pv9qx_;)PGtn9Gj?l+Wh)Az5N-Dz*%9uy!vIop}mt~C;9ZEsiYzPn}@5}j+B6jxcE2}FFe zpgnUU-WW$>isPzXE0hfo84LBObwg|5jkhVc1JKbJ&iT*1y<5o_ul>$;4$sds5~(FW zC#d(Q*2L+5v3b>Z`j)`$r-H_d5eJ56h6XO6%qZJ|1cM@^xH}~ygGnP_ECyUnvDfa* zs<=NJ)YLFR;u_iIk(DR`)&0RQWO8h+ir5G58(jz3u}xOCpJm5U1L!)zee%_WBH;f+Bu-`B}&Bm{+RvYS>1c6r;m@KmX;Q1T4DNr-f z)7`kAY>suf5|fkLdyQ#Wwp9@P37i<8 znAlox#NfTB9lyg27A-9;8V-&E@Q}*@G8iCD35-ifAo9Q1m%lmR!zUrJ5g6G3j+mT` z7akc&$InkVU9D%yO-~0dr9SxLV2K0_?avqYpJ?;2sd@4yBm}O}b`oJMM@Z4tl{+^t zuWY);z$5Gr;+<<*U$=S(a@nuN&WE)|P4%%*Hh?W;WMwBio_p}SEK&gVeF3ss-~A~- zeifL$C4t=&c!Wnzj*&K`+lXDF5mi`N*zqG9fTvLXnwNC+^lg6|ZszUXEbP9H=6$f3 zU_JJVmYKOiDRW?Hi5jdWV{6MoF64|QBqU_l8;L!y^+z}TVW4WS(8&9^*y%s{`bh&F zb$GM)-gny{&5-ZSPI2HcT}V=}i_!fJ;*z4{QWqt}xLMA^!XgC{rC%fO>gsALd~$J- z*>!*C?@R-`m*Q1Mc6Qa@zfZ=$z4v1O-r{0rHL|k08cGZ?Ds=kM?0YtC0FV@<)~q}K zA*`;AuDpzijV1We>?8}ec63S%48qa2I(-AiJzWdDhh&z6J-C|H2|w_=f9pfF1#lKDOLV>#ySFn z2#<;?v969=_pK=STj73~ufrPm|QG{sfzbC+N{}oL% zPvezDpr{ZQSb`NA8SXhmX|3dn|HL))g+tz;0suiVK&OSknSD>UwTpt98yfhGTAUMR zP5rSUMvWoB>Q9H53tUU^wBHq9FDHH)Rde%QXUKI&Q+WM`{B9!sg|z$c@hEgYl^82s z{(kyCSNLhQ7VY4EjBS&rB7+P=bb>O5zm}t=-YsyI6c_hhpY6W08K)w}ituqOo3_U% zCyzZmbZvBAAm88LcYGLK`3(dznQ4VXw)hHgBM& z;WK_d@M$}LaeFSZMVj^gTZuk50Q=8dgo1DOT4ZkKK{6>acx$@-wdw(234G%p;BSPj zQVBH7aV$Q~DpXNI4Ec*udc$(CH5i$zBp(wKV*z3j%(PR|({))2er{|;I4``1NkKzH zOKx`h@d;a6PFE^6^!r@RTq|kGqV4)WxF?c%{&cQ(u~wWrX*IQY!!~zDqh?3+l1ba6 z@iYc>SRjF^qg?%=u!xBARJr!ZGgY_9Wun-Q6#IW;&f0#Vrzi4eE5i z^Ze`j;5Jw%&1g=NsM{i4ZqN6T^^YKDKF*_M8aapX2KFCSk&P}szqr;mOg4Nw!`cPJ!~7X{zn z*-n*Xdy3}qTlAqhBhk@0VB5QYQXAn?-tB|Po(kzae%uc-?qszddueH@;b{X1z4*Xs z?{05OKrH+ciT$t@9#A>7l_H{s`)-8h!z&rI*Kr`aM!R%fp}?Y=zJ7+hWDUrTpx%{w zYudRC!qiy4c+SI+=)sK8@2XHrj%KY-@xsnz#rN;Mb~7%oci+P9B@Xx9WUHIy=>Z6| z#x0Q=6={*U)St1XH*57C{P3y*^K7{ zz_U34C^dbBBSM`8BR{FV!VJLn(I&)}sUV~&Yw3LsFmp-&U@t3m&&LLbLA|EfG};yOs%nH zUo<`%21cr&)Av3iO*tz>!lixRWGlR0Ye_Ar#ku)YlS#&}*~SsaV+)}kfkxLeTb=$F zeE<%<^Vre=Q8+Fj666bCUtw?&ksz-uE;7*7)5ex3`^~g%bMWld$jMvQM6|dL^mR#y zrD(l~PN@4PE(5q?*bPBPGR${pYKi^hV7?8?xsS^q!bC2Z@U`7=?colM)iN%9)p=8= zFlP7)Q$o5Z#d$6TxInDV*BW#VGm?=BHS7uy>AKl}M2eM>J=Z%m^#BnCOR78Q7SyxK zRGKiN?tUo^E6wooDFROZP-y97*Wm^Bby{ zpaAs5?Y^!Ai|j_V8Sn|wgBm|M?(wa&JRY}}R~edI{XXo)wO#5G2bhcFm@MI;(5EaO zOFROCk2az)u*}RNnMnDF$u#)ZtFN!mu=EaG-73g_3ZPCF>3{GC(rhS#n05K9VVv7) z5HIelS$9xiJhdbh$l8{;pn3;&=EeZP*nOeMm=jG7263ZIS``|U@ehS?fX7)$(f`Tl zzXt~g@oMyIWdP!W95dN~QsYw+brMiCci|tdP&l`BJvgY;ad*9oC$kWP3yWPXi+-33?LJ#- z2!AbRh7uW7_1Ni(l;VFI=~Yfvp=UQPzKuRX7T~5TqqmuvB%k8R!XyH(57jkb zZ3%j|==ph*ch+O%Afand+Z6y#iraNrDxN}w0MKGzdR`#5)yMqNX?G%(I2#P`z)<3} zUvF@?|IW~Q&ip7R>;gDw=((ltZ7=lxwEkM$@ikLR|Qo~)6Q5?Zs%QXe*q+HSHt^L2~f(XZ_km_l;rmov&54vu`NP2tjiIMW8tJeZW=y_GAg_ zo2TvNMtL|mIHVE*!V2-E@CF73DEy#hq1$n$EXV~|h|#=92B$mIs?*6c^-$Gc3+*HT zZZ!8L1Fg!x5VyCQ(#RF2{n*=!Pfh*SC=aB@EP&UHn(X_3{AF3XT7Xfq_?#@tFe}-jT!1(KG`Rvc*BckH;W%JqS)-RaNUT6cUcB5H5CPN@*Gyz87 zb?S#_ceo>aP{k z_OJ^A8-C^D0eU3r=1JsFu){vk5ObPT+AGyOuD}5qI?`t;F!Rs*G1&VESke(%^hMOx z)~^1#1xhBjwNK`U%iwYfQ!a0V5kAQa0mP|48n#-Mb!v$8b#qy z9)3WjE(F#NQ;(GpI5>u$ib^c0WRTcm;KfrtnOA^OCFU}XmyaV>#N zivfdCt$zQt-N!}k6+b$#>pwCw!F%FNK-%7&y$z08>5Zx(_yX=J9H8_Su)Pe@FQAK> z|4uQ1V+SPXVvxZBUHaH0Q@^Gkq$VEkUxqj)s({)<0LrCv_wbOnvMSyF(ejp!7Sv+) zu*!%@Gk^4jLkxi1&yvWi_5ms{25>PtF;U+nlR=r3-xiNaEep=Z#^#SL>x2DN18&v= zRL{kr;;asDg!u#@7P3UWs{fdBKfeE0B_f!m{`&S#*mXIC?W_|-uq;6*a=-$Sf#_HH z%_51M_53sfUO>hO#FaWwRKa}1LW!QPcr{Vno*@UYwy;1fCx-;k-|96inIuVEqX9+$ zrWT-l1_K?PRG6oM)KK2a34Bd0M=-&|6SNq4DpPcrHS-CdzW3CI9)1Ve!eW2E4NzBf zuy_b^!4Q<6ynnSnj>mR_291_*dSiJxq-81SA&5f&HCcjPz@knYm6$IL3KnSyxEaaWlvK!ou?xFpoN4&NK_chougC z`|4sp2IY^ShrsPTFAPxk+`2O0C5>TZCb**hy&o-ZpziEQvr$k$!9qbCwdMny;|j2N z0Gf(*t8`e*y2PsWYh%d;>w+3)324G(w?ml2&w_WC+ zTd5uDxs9{|QC~0iKx@3q}6S zuF0t5YBLAmjmYWOn4pINqdy-oYb^hoYk+amU%q_Nty!9!#P{0yDxJopK2ao#`t{Az zoB^>AaL-4(Z@X84pTQU@f(H-c&WE2?$O1kDV3$z9D*@KB5M0B&{{4dfKoa!;jCb7m z$~xZ_X#CP|1SIov^&C1eF$(op{4extHm$=5XLP4CjHjrK;pdEQFVPy37mpS{grO%O(1Al z2tPk&I6qiQ0(riQeAKiQkht6PZG6|~dvUzbVZxfVB@hXFqj1-vsDpZdF{ET?+f9!c z1NN%XagG31j)b9L$NtLx0up^R_&vz>127_3WV~{z4YeTK#sVu`8%&`e93HOU_BlN} z>woCd@!|y{>c^3h5vC-}=D8hIfyL|6`*$u&5|g#YLRMB*EM1}n{B{H=I20`Y-x5Gg zH%Nt03J7gv&Ib=4vS)CaC1ya3*}5=pn1L?Y>h~T3lZByX*p8B@B{@@}(Md@I_0W+z z@ESx*Ww0G2FtmQRCnGu5?lD`iTVT>6lX=BhIFnwF7ZHB=fKr{m6 zY;@$2FAo6?F~Cptf}{s5OsBG-wiGgWaAXZ?TwqDD0meVi{5YP}BLTnuG?d0H4~lfB z&8%lRV}%MC?Wqqyn%3Q@{j8BEy3&g)sSC~5U_=cB>ziFZ0zZsl0T^&VHKg^sIEZcR z?8Ii8`c+Ld?*TO42MEhVV3EdqcQ%4KFplZhQaANOK}S501RCP%yaDeEqeT z#{*WL=(`Q*WXcUU(=Oo06PdSV;xiB5DN^l%RCbfkwgu$^%fU5N|K<-J%a}=Mg%}rJh&+~eLDb5IU4YzdA^zr%AFYpurOhAhIPWN%hgDRh?tFDOBN zthkgj1+ag#K$2R({%i80?;5sV#sN@}lBQ;+-VCVf0N3uf{{qUJ4XZamMUqU{h74*V z^|;_qfK!$ObpT=1LGkejS9c-E*sTCSqG4e*R@Hd}qyZxfqHw9dd)>gOdKqkc6^%Q| z+tVqJ`@O!H2gNY5@vhk^=uadA$hT;AH=?O4WI!-SIzcxb^lyMAL;{~=e^aBFM0L3w zhN~OAt@o3Ub-XEm}G4F-Xp@n-*ee+yVvmal2EfEm*jUj%vC@VzH%Bo-M$!<-}E?(Ol$i0>}= zk>Hmv8BI(~Uhn^9cx-LK_g&jl6-mXPa4*LLZ*V1lrw? zM(TptsD;X{e*%B@`ZWiS{Z|$WiGXiRv$p__9`3gv7;V(Q8*9eGwp2ZG2c~lbm=bmz zI{^GXT`UDB!A$b?yF>tW_6osgaXNrqYNb#g8r2fR!^2n4-TH1gK{6P62Q= z^vs6EDS!(ZYhLH%7%$d*W!A{W14hyE3h!}^KIAuuiPaGYAl1|J^43pe!15v>nE|c{ zX>Wf75J-JP188VjAGuWk_KXKq3&6230MMyv#eQ$zi*mFQMQ!vt2-K(m1|R|*!vG3k zl29cjC4K$;J_3XROZ}dn;bCEjKpeoUDQRh8pfBDr^dl`b)%9ZkDM+3VTU?eD0s=Z# zZMGdZJ=Y;EcO4#vF611iP!_S#D?2^lN`6FEIC;L^#=z+mXPJZ-~e3St0!+7QEQ z^KUrKa{xq60isL}P;7)t1ej=OJpdCz7URnG*IrNBmTqs`PF84A*X-Eo?7}+&Xs{T3 zA2^t&!`yAq`r^e4Si{MFx;g?>D!pT4doC@(3JQ_1yaYZtarncfdj){{>TdPS^z`tH zMSont2~_eR#S<93F~J9nlzx*22yvj3Qw;K+?Uzz?K)Wzi@iecPwM+s3g7v{oI(+c~ zjOEZ8kAQS4X|;Pht#59|n)gPsV%U)PD?r(8hq%Y$y3 zZnok(KsDWbg4B87Eqj zR3hs&Lz0y(tNcHAzyJ0BpR4OSo$Gqf^FHtM-1qnUS>O9Cy2(-Z;i%Cm5D`VF7QKUm zd`@loy@A$GS}T}2IfaQ>2K18N-BEJ(F0WdiI@MX>sfp)W z37Z@6=SC!bXZ*&E8(*QoH>7LtR}FjW`fYy1_c5!e8I#Z4=u5oP@cZ}YIwz*kxS8Hl zVFcbn&VV)mG;{}M7IUcypz&nO8JFH@12gS`%a^6^j{RQxRjsn;$_;bB1xm4d)T2is zKyyqBUO`SJ1L@uGfEE6KJn39cz%LpXsu!
5+tFAQhW-q8F-BAvd#6x{c##0Xyj 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 H0i*vPz02V& diff --git a/docs/source/_static/prospr_logo.xcf b/docs/source/_static/prospr_logo.xcf deleted file mode 100644 index 81e19945786be6f4bebfb5e3624acb6c26629538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52177 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 diff --git a/docs/source/_static/quickstart_basic.png b/docs/source/_static/quickstart_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..24e9edc1f8a37eb704b4af721e4c66f64b40efbf GIT binary patch literal 20493 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/quickstart_paper_no_legend.png b/docs/source/_static/quickstart_paper_no_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..91f8dc26f5dbf51bcbeaf2d8dac4069e72e38e91 GIT binary patch literal 7759 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 Bf8YQB literal 0 HcmV?d00001 diff --git a/docs/source/_static/quickstart_paper_outer.png b/docs/source/_static/quickstart_paper_outer.png new file mode 100644 index 0000000000000000000000000000000000000000..42a865c7c6bc117b6119671f50734b823df5c1a2 GIT binary patch literal 10369 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 BF#P}k literal 0 HcmV?d00001 diff --git a/docs/source/api.rst b/docs/source/api.rst index a80c1ef..156c352 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -27,7 +27,7 @@ specifying a submodule, e.g. | *Returns:* | * **Protein** - the Protein object set at the found conformation and with updated properties according to the - performedmoves. + performed moves. | **depth_first_bnb**\ (*protein*) | Finds the most optimal conformation using a depth-first @@ -37,9 +37,85 @@ specifying a submodule, e.g. | * **protein** - *Protein*: the Protein object to fold. | *Returns:* | * **Protein** - the Protein object set at the found - conformationand with updated properties according to the + conformation and with updated properties according to the performed moves. + | **beam_search**\ (*protein, beam_width=-1*) + | Finds a best-effort conformation using a beam search algorithm. + | *Does not reset the Protein properties beforehand!* + | *Parameters:* + | * **protein** - *Protein*: the Protein object to fold. + | * **beam_width** - *int (optional)*: the beam width to use, + where -1 indicates traversal of the entire search space. + | *Returns:* + | * **Protein** - the Protein object set at the found + conformation and with updated properties according to the + performed moves. + +AminoAcid - core +---------------- +Protein objects use AminoAcid objects internally to keep track of the chain on +the grid. AminoAcid objects have read-only properties, which are consulted +internally by the Protein object. The AminoAcid class can be imported directly +from *prospr* without specifying a submodule, e.g. + +.. code-block:: python + + from prospr import AminoAcid + +AminoAcid Properties +~~~~~~~~~~~~~~~~~~~~ +When using the Python package, each property can be directly called as an +attribute. If the C++ core is used, the property can be accessed using a method. +Each property is described below with the Python and C++ syntax for accessing +them. + + | **type** + | Type of the AminoAcid. + + +-----------------+---------------+ + | **Python** | *.type* | + +-----------------+---------------+ + | **C++** | *.get_type()* | + +-----------------+---------------+ + | **Return type** | *str* | + +-----------------+---------------+ + + | **index** + | Index of the AminoAcid within the Protein's sequence. + + +-----------------+----------------+ + | **Python** | *.index* | + +-----------------+----------------+ + | **C++** | *.get_index()* | + +-----------------+----------------+ + | **Return type** | *int* | + +-----------------+----------------+ + + | **prev_move** + | Move to perform in order to get to the previous AminoAcid in the + chain. + + +-----------------+--------------------+ + | **Python** | *.prev_move* | + +-----------------+--------------------+ + | **C++** | *.get_prev_move()* | + +-----------------+--------------------+ + | **Return type** | *int* | + +-----------------+--------------------+ + + | **next_move** + | Move to perform in order to get to the next AminoAcid in the chain. + + +-----------------+--------------------+ + | **Python** | *.next_move* | + +-----------------+--------------------+ + | **C++** | *.get_next_move()* | + +-----------------+--------------------+ + | **Return type** | *int* | + +-----------------+--------------------+ + + Datasets -------- Prospr provides many datasets. Each can be imported from the *prospr.datasets* @@ -61,11 +137,23 @@ submodule, e.g. sequences. | **load_vanEck1000**\ (*length=10*) - | Loads the vanEck250 dataset containing 1000 proteins per length, with - lengths from 10 till 100. + | Loads the vanEck1000 dataset containing 1000 proteins per length, + with lengths from 10 till 100. + | *Parameters:* + | * **length** - *int (optional)*: the length of the protein + sequences to load. + | *Returns:* + | * **DataFrame** - a Pandas DataFrame containing the protein + sequences. + + | **load_vanEck_hratio**\ (*length=25, hratio=0.1*) + | Loads the vanEck_hratio dataset containing proteins per length and + hratio combination. | *Parameters:* | * **length** - *int (optional)*: the length of the protein sequences to load. + | * **hratio** - *float (optional)*: the hratio upperbound of + the hratio interval to use. | *Returns:* | * **DataFrame** - a Pandas DataFrame containing the protein sequences. @@ -130,13 +218,24 @@ directly from *prospr* without specifying a submodule, e.g. from prospr import Protein .. -Properties -~~~~~~~~~~ +Protein Properties +~~~~~~~~~~~~~~~~~~ When using the Python package, each property can be directly called as an attribute. If the C++ core is used, the property can be accessed using a method. Each property is described below with the Python and C++ syntax for accessing them. + | **bond_values** + | The ways to form bonds and their stability. + + +-----------------+----------------------+ + | **Python** | *.bond_values* | + +-----------------+----------------------+ + | **C++** | *.get_bond_values()* | + +-----------------+----------------------+ + | **Return type** | *Dict[str, int]* | + +-----------------+----------------------+ + | **changes** | The number of amino acids placed so far. @@ -203,6 +302,17 @@ them. | **Return type** | *List[int]* | +-----------------+-------------------+ + | **max_weigths** + | For each amino acid, the maximum value a bond can make. + + +-----------------+----------------------+ + | **Python** | *.max_weigths* | + +-----------------+----------------------+ + | **C++** | *.get_max_weigths()* | + +-----------------+----------------------+ + | **Return type** | *List[int]* | + +-----------------+----------------------+ + | **score** | The score of the current conformation. @@ -241,6 +351,15 @@ references below. move. | E.g. `[0, 1]` + | **.get_bonds**\ () + | Returns a list of amino acid index pairs that are bonding. + | *Parameters:* + | * **None** + | *Returns:* + | * **List[Tuple[int,int]]** - a list of tuples with two amino + acid indexes that bond. + | E.g. `[(0, 9), (2, 9), (9, 2), (9, 0)]` + | **.hash_fold**\ () | Returns a list of moves representing the current conformation. | *Parameters:* @@ -313,10 +432,27 @@ e.g. from prospr.visualize import plot_protein .. - | **plot_protein**\ (*protein*) + | **plot_protein**\ (*protein, style="basic", ax=None, legend=True, + legend_style="inner", show=True,* + | *linewidth=2.5, markersize=210, annotate_first=False*) | Plots the current set conformation of the given Protein object. | *Parameters:* | * **protein** - *Protein*: a Protein object to plot the conformation of. + | * **style** - *str (optional)*: The figure style to use, + either 'basic' or 'paper'. + | * **ax** - *Axes (optional)*: If given, plot the conformation + on the given Matplotlib Axes. + | * **legend** - *bool (optional)*: Set to False to disable the + legend. + | * **legend_style** - *str (optional)*: The legend style to + use, either 'inner' or 'outer'. + | * **show** - *bool (optional)*: Set to False to disable + plt.show() call. + | * **linewidth** - *float (optional)*: Line width of the chain. + | * **markersize** - *float (optional)*: Size of the amino + acids. + | * **annotate_first** - *float (optional)*: Set to True to + highlight first amino acid with a color. | *Returns:* | * **None** diff --git a/docs/source/conf.py b/docs/source/conf.py index 3a236f0..09d521b 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,20 +9,26 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) + + +# Add prospr core folder to path in order to import the current version. +import sys + +sys.path.insert(1, "../../prospr") + + +# Import of current version of the package. +from _version import __version__ # noqa: E402 # -- Project information ----------------------------------------------------- project = "prospr" -copyright = "2021, Okke van Eck" +copyright = "2023, Okke van Eck" author = "Okke van Eck" # The full version, including alpha/beta/rc tags -release = "0.2a3" +release = __version__ # -- General configuration --------------------------------------------------- @@ -45,19 +51,40 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -# -html_theme = "alabaster" +html_theme = "furo" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] +# Furo theme options. +html_css_files = [ + "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/" + "fontawesome.min.css", + "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/" + "solid.min.css", + "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/" + "brands.min.css", +] + +html_logo = "_static/prospr_logo.png" +html_title = ( + "" + "" + "Optimized Protein folding in Python and C++" + "" + "" +) + html_theme_options = { - "logo": "prospr_logo.png", - "description": "Optimized Protein folding in Python and C++.", - "description_font_style": "italic", - "github_user": "OkkeVanEck", - "github_repo": "prospr", - "github_type": "star", + "footer_icons": [ + { + "name": "GitHub", + "url": "https://github.com/okkevaneck/prospr", + "html": "", + "class": "fa-brands fa-solid fa-github fa-2x", + }, + ], + "navigation_with_keys": True, } diff --git a/docs/source/index.rst b/docs/source/index.rst index 0041006..51f0a2b 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -5,7 +5,7 @@ Prospr: The Protein Structure Prediction Toolbox ================================================ -Release v\ |release| +Release v\ |release|. Welcome to Prospr's documentation! Prospr is a Python toolbox for protein structure prediction, build on a C++ core. The Python package can be used when diff --git a/docs/source/installation.rst b/docs/source/installation.rst index e4a9fcd..18e5d1c 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -10,7 +10,7 @@ instructions are provided for both scenarios. Python package -------------- -Prospr offers support for Python 3.6 and newer. However, using the latest Python +Prospr offers support for Python 3.9 and newer. However, using the latest Python version is always recommended. The instructions below assume that a new project will be set up. @@ -36,8 +36,8 @@ For Windows: > py -3 -m venv venv > venv/Scripts/activate -Installing Prospr -~~~~~~~~~~~~~~~~~ +Installing Prospr (Python) +~~~~~~~~~~~~~~~~~~~~~~~~~~ After activating the environment, use pip to install Prospr: .. code-block:: bash @@ -53,8 +53,8 @@ C++ core Using the C++ core for your project is very easy. Follow the installation steps below and include the header files you want to use in your code. -Installing Prospr -~~~~~~~~~~~~~~~~~ +Installing Prospr (C++) +~~~~~~~~~~~~~~~~~~~~~~~ Using the C++ core is very easy. Download a *prospr_core* archive from the `archives `_ folder on GitHub, then drag the source files to your code directory. Add the files to diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 27a921e..402e98f 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -16,37 +16,67 @@ be installed. Creating Proteins ----------------- After installing Prospr, creating Protein objects is quite easy. A Protein -object can be seen as a space manager for AminoAcid objects. AminoAcid objects -can simply be created as: +object can be seen as a space manager for AminoAcid objects. The AminoAcid +objects store the internal linkage, their index in the protein sequence, and +their type. When generating a Protein object, the required AminoAcid objects +are created and linked automatically as well. + +One can simply create an HP-model Protein object as follows: .. code-block:: python - from prospr import AminoAcid + from prospr import Protein + p_2d = Protein("HPPHPPH") + p_3d = Protein("HPPHPPH", dim=3) + p_4d = Protein("HPPHPPH", dim=4) + p_5d = Protein("HPPHPPH", dim=5) + ... +where *dim* is the dimension to fold in. -one can simply create a Protein object as -follows: +The *model* parameter allows for selecting different models in the future. +So far, only the HP and HPXN models are supported. You can create a HPXN-model +protein as follows: .. code-block:: python from prospr import Protein - p_2d = Protein("HPPHPPH") - p_3d = Protein("HPPHPPH", dim=3) - p_4d = Protein("HPPHPPH", dim=4) - p_5d = Protein("HPPHPPH", dim=5) + p_2d_hpxn = Protein("HPNPPNH", model="HPXN") ... -There are many other options for constructing a Protein object. Please see -:doc:`api` for more details. +Custom models are also possible by providing a dictionary mapping the possible +ways to bond. The dictionary should map strings to integers, where the strings +are two characters identifying the amino acid types that can bond, and the +integer the stability value of that bond. As an example, this is a redefinition +of the HPXN-model: + +.. code-block:: python + + from prospr import Protein + + bond_values = {"HH": -4, "PP": -1, "PN": -1, "NN": 1} + p_2d_HP = Protein("HPNPPNH", dim=2, bond_values=bond_values) + +Note that the inverse of the bonds (e.g. *NP* from the *PN* bond) are added +automatically. If you **do not** want this, disable *bond_symmetry* through the +parameter: + +.. code-block:: python + + from prospr import Protein + + bond_values = {"HH": -4, "PP": -1, "PN": -1, "NN": 1} + p_2d_HP = Protein("HPNPPNH", dim=2, bond_values=bond_values, bond_symmetry=False) + Protein attributes ------------------ A Protein object keeps track of multiple properties while it is being folded. -These properties can be checked as attributes of the Protein object. Below all -properties are listed, but please refer to the :doc:`api` to see what they -all keep track of exactly. +These properties can be checked as attributes of the Protein object. All +properties are listed below and speak for themselves, but please refer to the +:doc:`api` to see their exact descriptions. .. code-block:: python @@ -81,6 +111,9 @@ all keep track of exactly. p_2d.bond_values >>> {"HH": -1} + p_2d.max_weights + >>> [-1, 0, 0, -1] + Placing amino acids ------------------- A Protein object is generated with the first amino acid fixed at the origin. @@ -129,8 +162,9 @@ Placement information While writing algorithms, it might be necessary to check what amino acid is placed at a specific spot, or where the previous and next ones are placed. This can be checked via the *.get_amino(position)* function, which takes a list of -integers representing the requested position as an argument. It returns a list -containing the amino acids index, previous direction, and next direction. +integers representing the requested position as an argument. It returns an +AminoAcid object, which has its *type*, *index*, *prev_move*, and *next_move* +as attributes. .. code-block:: python @@ -139,8 +173,19 @@ containing the amino acids index, previous direction, and next direction. p_2d = Protein("HPPH") p_2d.place_amino(1) p_2d.place_amino(2) - p_2d.get_amino([1, 0]) - >>> [1, -1, 2] + amino = p_2d.get_amino([1, 0]) + + amino.type + >>> "H" + + amino.index + >>> 1 + + amino.prev_move + >>> -1 + + amino.next_move + >>> 2 It might also occur that you want to check if an amino acid at a specific index can create bonds. This can be checked via the *.is_weighted(index)* function, @@ -303,11 +348,10 @@ the origin remains in place. Built-in algorithms ------------------- -Prospr offers some algorithms for finding the most optimal conformation of a -Protein. These are included in the C++ core, making them time efficient relative -to Python alternatives. The :doc:`api` contain a list of all available -built-in algorithms. They can all easily be used via a direct import, as is -shown below. +Prospr offers some algorithms for folding Proteins. These are included in the +C++ core, making them time efficient relative to Python alternatives. The +:doc:`api` contain a list of all available built-in algorithms. They can all +be easily used via a direct import, as is shown below. .. code-block:: python @@ -323,10 +367,11 @@ shown below. Visualizing conformations ------------------------- -Visualizing conformations can be key to understanding how the optimal +Visualizing conformations can be key to understanding how the resulting conformation was found. It also helps illustrating your research. Prospr's Python package has a built-in visualization module so you do not have to write -your own. Visualizing a conformation can easily be done via the *plot_protein()* +your own. The module automatically detects the dimension and plots accordingly. +Visualizing a conformation can easily be done via the *plot_protein()* function from the *prospr.visualize* module. .. code-block:: python @@ -346,19 +391,90 @@ function from the *prospr.visualize* module. :align: center :scale: 85 +The *plot_protein()* function has a couple parameters to style the figure to +your likings. Most importantly, there are two styles to select: *basic* and +*paper*. The first will show the protein in a clear and zoomed-in way, while +the latter is more compact and fancy. Here you can see the difference between +the two for the same conformation. + +.. code-block:: python + + p_2d = Protein("HPHPHPPPHH") + depth_first_bnb(p_2d) + plot_protein(p_2d) + >>> + + plot_protein(p_2d, style="paper") + >>> + +|basic_fig| |paper_fig| + +.. |basic_fig| image:: _static/quickstart_basic.png + :width: 49% + +.. |paper_fig| image:: _static/quickstart_paper.png + :width: 49% + +Besides the style, it is also possible to change the positioning of the legend. +You can turn the legend off through the *legend* parameter, or change its +position to be *inner* or *outer* via the *legend_style* parameter. + +.. code-block:: python + + plot_protein(p_2d, style="paper", legend_style="inner") + >>> + + plot_protein(p_2d, style="paper", legend_style="outer") + >>> + + plot_protein(p_2d, style="paper", legend=False) + >>> + +|inner_legend| |outer_legend| |no_legend| + +.. |inner_legend| image:: _static/quickstart_paper.png + :width: 32% + +.. |outer_legend| image:: _static/quickstart_paper_outer.png + :width: 32% + +.. |no_legend| image:: _static/quickstart_paper_no_legend.png + :width: 32% + +There are also some parameters that alter the style of the figure. Please refer +to the :doc:`api` for a full overview. + + Using datasets -------------- Datasets are valuable for a fair comparison between algorithms. That is why Prospr's Python package comes with a built-in collection of datasets. Loading a dataset can easily be done via the available load functions in the -*prospr.datasets* module. Please refer to the :doc:`api` for all available -datasets. +*prospr.datasets* module. Currently, there are three datasets available: +*vanEck250*, *vanEck1000*, and *vanEck_hratio*. + +The *vanEck1000* dataset contains 1000 unique proteins for lengths +[10, 15, 20, .., 100], where the chances of sampling a H or P are equal. +*vanEck250* offers a subset of *vanEck1000*, by simply offering the first 250 +proteins for each length. *vanEck_hratio* has around 1000 proteins sampled for +each of the H-ratio intervals +{(0.0, 0.1), [0.1, 0.2), [0.2, 0.3), .., [0.9, 1.0)}. You can find their usage +below, as well as in the :doc:`api`. .. code-block:: python - from prospr.datasets import load_vanEck250 + from prospr.datasets import load_vanEck250, load_vanEck1000, load_vanEck_hratio length_10 = load_vanEck250() length_15 = load_vanEck250(15) length_20 = load_vanEck250(20) - ... + len(length_20) + >>> 250 + + length_20 = load_vanEck1000(20) + len(length_20) + >>> 1000 + + length_25_hratio_01 = load_vanEck_hratio() + length_10_hratio_04 = load_vanEck_hratio(10, 0.4) + length_15_hratio_06 = load_vanEck_hratio(length=15, hratio=0.6) diff --git a/manage.sh b/manage.sh index 3f25865..5c6ca1a 100755 --- a/manage.sh +++ b/manage.sh @@ -60,8 +60,17 @@ case "$1" in echo -e "~ Removing build directories.." rm -rf build rm -rf prospr.egg-info + echo -e "~ Removing generated docs.." + rm -rf docs/build echo -e "~ Done cleaning!" ;; + # Generate docs locally. + "gen_docs") + cd docs + echo -e "~ Generating HTML documentation.." + make html + echo -e "~ Done generating!" + ;; # Build core, test all Python code, and then clean everything. "test") echo "~ Uninstalling old prospr.." diff --git a/prospr/__init__.py b/prospr/__init__.py index f350657..0f4e85a 100644 --- a/prospr/__init__.py +++ b/prospr/__init__.py @@ -8,7 +8,8 @@ from .datasets import load_vanEck250, load_vanEck1000, load_vanEck_hratio from .visualize import plot_protein -__version__ = "0.2a43" +# Import __version__ from _version.py during compile time. +exec(open("prospr/_version.py").read()) __all__ = [ "__version__", diff --git a/prospr/_version.py b/prospr/_version.py new file mode 100644 index 0000000..4802e90 --- /dev/null +++ b/prospr/_version.py @@ -0,0 +1 @@ +__version__ = "1.0" diff --git a/prospr/core/core_module.cpp b/prospr/core/core_module.cpp index 9fcdced..96d1613 100644 --- a/prospr/core/core_module.cpp +++ b/prospr/core/core_module.cpp @@ -88,6 +88,6 @@ PYBIND11_MODULE(prospr_core, m) { /* Beam search function definition. */ m.def("beam_search", beam_search, - "Finds the optimal conformation via beam search", py::arg("protein"), + "Finds a best-effort conformation via beam search", py::arg("protein"), py::arg("beam_width") = -1); } diff --git a/prospr/datasets.py b/prospr/datasets.py index 3d953ea..2c93489 100644 --- a/prospr/datasets.py +++ b/prospr/datasets.py @@ -7,16 +7,12 @@ specifics. """ -import pkg_resources import pandas as pd def _load_dataset(folder, filename): """Returns a specified dataset as a dataframe.""" - stream = pkg_resources.resource_stream( - "prospr", f"data/{folder}/{filename}" - ) - return pd.read_csv(stream) + return pd.read_csv(f"prospr/data/{folder}/{filename}") def load_vanEck250(length=10): diff --git a/pyproject.toml b/pyproject.toml index 4902902..645ba7c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ requires = [ "setuptools>=42", "wheel", - "pybind11~=2.6.1", + "pybind11~=2.11.0", ] build-backend = "setuptools.build_meta" @@ -53,7 +53,7 @@ platforms = ["Linux", "macOS", "Windows"] prospr = ["data/*/*.csv", "core/src/*"] [tool.setuptools.dynamic] -version = {attr = "prospr.__version__"} +version = {attr = "prospr._version.__version__"} [tool.black] line-length = 79 diff --git a/requirements.txt b/requirements.txt index 99eb5ba..5abd7af 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,13 @@ -matplotlib==3.6.3 -numpy==1.24.1 -pandas==1.5.2 -pre-commit==2.21.0 -pybind11==2.10.4 -pytest==7.2.1 -pytest-order==1.0.1 +furo==2023.5.20 +matplotlib==3.7.2 +numpy==1.25.1 +pandas==2.0.3 +pre-commit==3.3.3 +pybind11==2.11.0 +pytest==7.4.0 +pytest-order==1.1.0 seaborn==0.12.2 -setuptools==66.0.0 -sphinx==6.1.3 +setuptools==68.0.0 +sphinx==7.0.1 twine>=4.0.2 -wheel>=0.38.4 +wheel==0.40.0